@fayz-ai/plugin-agenda 0.1.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.
- package/README.md +51 -0
- package/dist/AgendaContext.d.ts +13 -0
- package/dist/AgendaContext.d.ts.map +1 -0
- package/dist/AgendaPage.d.ts +11 -0
- package/dist/AgendaPage.d.ts.map +1 -0
- package/dist/bridges/create-financial-bridge.d.ts +19 -0
- package/dist/bridges/create-financial-bridge.d.ts.map +1 -0
- package/dist/calendar-styles.d.ts +8 -0
- package/dist/calendar-styles.d.ts.map +1 -0
- package/dist/chunk-3LJKZQK4.js +12 -0
- package/dist/chunk-3LJKZQK4.js.map +1 -0
- package/dist/chunk-SYDBDI3Q.cjs +15 -0
- package/dist/chunk-SYDBDI3Q.cjs.map +1 -0
- package/dist/components/AgendaGeneralSettings.d.ts +3 -0
- package/dist/components/AgendaGeneralSettings.d.ts.map +1 -0
- package/dist/components/AppointmentModal.d.ts +16 -0
- package/dist/components/AppointmentModal.d.ts.map +1 -0
- package/dist/components/AppointmentPopover.d.ts +14 -0
- package/dist/components/AppointmentPopover.d.ts.map +1 -0
- package/dist/components/BookingPaymentPanel.d.ts +18 -0
- package/dist/components/BookingPaymentPanel.d.ts.map +1 -0
- package/dist/components/CalendarSidebar.d.ts +3 -0
- package/dist/components/CalendarSidebar.d.ts.map +1 -0
- package/dist/components/CalendarToolbar.d.ts +13 -0
- package/dist/components/CalendarToolbar.d.ts.map +1 -0
- package/dist/components/EventContextMenu.d.ts +14 -0
- package/dist/components/EventContextMenu.d.ts.map +1 -0
- package/dist/components/FloatingPanel.d.ts +27 -0
- package/dist/components/FloatingPanel.d.ts.map +1 -0
- package/dist/components/MiniCalendar.d.ts +9 -0
- package/dist/components/MiniCalendar.d.ts.map +1 -0
- package/dist/components/PaymentStatusBadge.d.ts +13 -0
- package/dist/components/PaymentStatusBadge.d.ts.map +1 -0
- package/dist/components/SearchCombobox.d.ts +38 -0
- package/dist/components/SearchCombobox.d.ts.map +1 -0
- package/dist/components/StatusBadge.d.ts +5 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/config.d.ts +151 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +3 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +26 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/financial-bridge.d.ts +92 -0
- package/dist/financial-bridge.d.ts.map +1 -0
- package/dist/hooks/useAgendaSettings.d.ts +7 -0
- package/dist/hooks/useAgendaSettings.d.ts.map +1 -0
- package/dist/index.cjs +5135 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5120 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/tenant.d.ts +3 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/registries.d.ts +3 -0
- package/dist/registries.d.ts.map +1 -0
- package/dist/store.d.ts +66 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/tenant-222EHYUC.cjs +16 -0
- package/dist/tenant-222EHYUC.cjs.map +1 -0
- package/dist/tenant-LAUWVUYB.js +3 -0
- package/dist/tenant-LAUWVUYB.js.map +1 -0
- package/dist/types.d.ts +202 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/CalendarView.d.ts +3 -0
- package/dist/views/CalendarView.d.ts.map +1 -0
- package/dist/views/ConfirmationsView.d.ts +3 -0
- package/dist/views/ConfirmationsView.d.ts.map +1 -0
- package/package.json +63 -0
- package/src/AgendaContext.tsx +11 -0
- package/src/AgendaPage.tsx +33 -0
- package/src/bridges/create-financial-bridge.ts +298 -0
- package/src/calendar-styles.css +245 -0
- package/src/calendar-styles.ts +285 -0
- package/src/components/AgendaGeneralSettings.tsx +64 -0
- package/src/components/AppointmentModal.tsx +1031 -0
- package/src/components/AppointmentPopover.tsx +221 -0
- package/src/components/BookingPaymentPanel.tsx +394 -0
- package/src/components/CalendarSidebar.tsx +119 -0
- package/src/components/CalendarToolbar.tsx +83 -0
- package/src/components/EventContextMenu.tsx +122 -0
- package/src/components/FloatingPanel.tsx +123 -0
- package/src/components/MiniCalendar.tsx +120 -0
- package/src/components/PaymentStatusBadge.tsx +62 -0
- package/src/components/SearchCombobox.tsx +216 -0
- package/src/components/StatusBadge.tsx +23 -0
- package/src/config.ts +269 -0
- package/src/data/index.ts +3 -0
- package/src/data/mock.ts +324 -0
- package/src/data/supabase.ts +570 -0
- package/src/data/types.ts +37 -0
- package/src/financial-bridge.ts +96 -0
- package/src/hooks/useAgendaSettings.ts +17 -0
- package/src/index.ts +180 -0
- package/src/lib/tenant.ts +3 -0
- package/src/locales/en.ts +207 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +207 -0
- package/src/registries.ts +36 -0
- package/src/store.ts +304 -0
- package/src/types.ts +265 -0
- package/src/views/CalendarView.tsx +904 -0
- package/src/views/ConfirmationsView.tsx +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/AgendaContext.tsx","../src/calendar-styles.ts","../src/hooks/useAgendaSettings.ts","../src/components/MiniCalendar.tsx","../src/components/SearchCombobox.tsx","../src/components/BookingPaymentPanel.tsx","../src/types.ts","../src/components/AppointmentModal.tsx","../src/components/FloatingPanel.tsx","../src/components/AppointmentPopover.tsx","../src/components/EventContextMenu.tsx","../src/views/CalendarView.tsx","../src/AgendaPage.tsx","../src/data/supabase.ts","../src/data/mock.ts","../src/store.ts","../src/registries.ts","../src/components/AgendaGeneralSettings.tsx","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/bridges/create-financial-bridge.ts","../src/index.ts"],"names":["React","jsxs","jsx","useState","useEffect","t","createPortal","useRef","Fragment","useTranslation","getCurrentLocale","useMemo","getSupabaseClientOptional","X","getAgendaTenantId","toast","Check","STYLE_ID","useCallback","fmtCurrency","PersonLink","Clock","User","MapPin","FileText","HandCoins","DollarSign","AlertTriangle","Tooltip","Pencil","Trash2","usePluginPrefs","booking","Plus","ChevronLeft","ChevronRight","Button","now","addMinutes","setScheduleBlockConfig","getScheduleBlockConfig"],"mappings":"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AAA,CAAI,QAAA;;;ACHlC,IAAM,QAAA,GAAW,6BAAA;AAEjB,IAAM,GAAA;AAAA;AAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;A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","file":"index.js","sourcesContent":["import type { PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { StatusConfig, BookingTypeConfig } from './types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Public options interface\n// ---------------------------------------------------------------------------\n\nexport interface AgendaPluginLabels {\n pageTitle: string\n pageSubtitle: string\n calendar: string\n dayView: string\n weekView: string\n monthView: string\n listView: string\n workingHours: string\n confirmations: string\n newAppointment: string\n filters: string\n}\n\nexport interface ConfirmationChannelOption {\n id: string\n label: string\n icon: string\n}\n\nexport interface LocationOption {\n id: string\n name: string\n isHQ?: boolean\n}\n\nexport interface AgendaPluginOptions {\n modules?: {\n workingHours?: boolean\n confirmations?: boolean\n conflictDetection?: boolean\n dragAndDrop?: boolean\n locationSelection?: boolean\n /** Enable financial integration (auto-enabled when financialBridge is provided) */\n financial?: boolean\n }\n labels?: Partial<AgendaPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n\n /** Booking kind used in saas_core.bookings.kind (default: 'appointment') */\n bookingKind?: string\n\n /** Order kind for financial records (default: 'service_order') */\n orderKind?: string\n\n /** Schedule kind in saas_core.schedules.kind (default: 'working_hours') */\n scheduleKind?: string\n\n /** Booking type tabs shown in the appointment modal */\n bookingTypes?: BookingTypeConfig[]\n\n /** Booking status options */\n statuses?: StatusConfig[]\n\n /** Default calendar view (default: 'resourceTimeGridWeek'). Options: 'dayGridMonth', 'timeGridWeek', 'resourceTimeGridWeek', 'listWeek' */\n defaultCalendarView?: string\n\n /** Calendar visible time range (default: '07:00'-'21:00') */\n businessHours?: { startTime: string; endTime: string }\n\n /** Slot duration in minutes (default: 30) */\n slotDuration?: number\n\n /** Person kind for professionals (default: 'staff') */\n professionalKind?: string\n\n /** Person kind for clients (default: 'customer') */\n clientKind?: string\n\n /** Auto-create an order when creating a booking (default: true) */\n autoCreateOrder?: boolean\n\n /** Contact/client lookup */\n contactLookup?: EntityLookup\n\n /** Client entity definition for the Client tab in booking modal */\n clientEntityDef?: EntityDef\n\n /** Service lookup */\n serviceLookup?: EntityLookup\n\n /** Professional/staff lookup */\n professionalLookup?: EntityLookup\n\n /** Location lookup */\n locationLookup?: EntityLookup\n\n /** Called when user clicks a selected entity link (e.g. view client profile) */\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n\n /** Business locations for unit filtering */\n locations?: LocationOption[]\n\n /** Confirmation channel options */\n confirmationChannels?: ConfirmationChannelOption[]\n\n /** Financial bridge for agenda × financial cross-plugin integration */\n financialBridge?: AgendaFinancialBridge\n\n /** Data provider — defaults to Supabase, falls back to mock */\n dataProvider?: AgendaDataProvider\n\n /** Default values for schedule block advanced settings */\n scheduleBlockDefaults?: {\n bufferMinutes?: number\n maxConcurrent?: number\n minAdvanceHours?: number\n maxAdvanceDays?: number\n }\n\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: AgendaPluginLabels = {\n pageTitle: 'Agenda',\n pageSubtitle: 'Calendar and appointment management',\n calendar: 'Calendar',\n dayView: 'Day',\n weekView: 'Week',\n monthView: 'Month',\n listView: 'Agenda',\n workingHours: 'Working Hours',\n confirmations: 'Confirmations',\n newAppointment: 'New Appointment',\n filters: 'Filters',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_STATUSES: StatusConfig[] = [\n { value: 'scheduled', label: 'Scheduled', color: '#6366f1' },\n { value: 'confirmed', label: 'Confirmed', color: '#3b82f6' },\n { value: 'in_progress', label: 'In Progress', color: '#f59e0b', availableWhen: 'today_only' },\n { value: 'completed', label: 'Completed', color: '#10b981', availableWhen: 'today_or_past' },\n { value: 'cancelled', label: 'Cancelled', color: '#ef4444' },\n { value: 'no_show', label: 'No Show', color: '#6b7280', availableWhen: 'today_or_past' },\n]\n\nconst DEFAULT_BOOKING_TYPES: BookingTypeConfig[] = [\n {\n id: 'appointment', label: 'Appointment', icon: 'Calendar', color: '#6366f1',\n fields: { client: true, professional: true, services: true, location: true, status: true },\n requiresServices: true, requiresClient: true,\n },\n {\n id: 'task', label: 'Task', icon: 'CheckSquare', color: '#f59e0b',\n fields: { client: false, professional: true, services: false, location: false, status: true },\n requiresServices: false, requiresClient: false,\n },\n {\n id: 'block', label: 'Block', icon: 'Ban', color: '#6b7280',\n fields: { client: false, professional: true, services: false, location: false, status: false },\n requiresServices: false, requiresClient: false,\n },\n]\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface AgendaModules {\n workingHours: boolean\n confirmations: boolean\n conflictDetection: boolean\n dragAndDrop: boolean\n locationSelection: boolean\n financial: boolean\n}\n\nexport interface AgendaCurrency {\n code: string\n locale: string\n symbol: string\n}\n\nexport interface ResolvedAgendaConfig {\n modules: AgendaModules\n labels: AgendaPluginLabels\n currency: AgendaCurrency\n bookingKind: string\n orderKind: string\n scheduleKind: string\n statuses: StatusConfig[]\n bookingTypes: BookingTypeConfig[]\n businessHours: { startTime: string; endTime: string }\n slotDuration: number\n professionalKind: string\n clientKind: string\n autoCreateOrder: boolean\n locations: LocationOption[]\n confirmationChannels: ConfirmationChannelOption[]\n contactLookup?: EntityLookup\n clientEntityDef?: EntityDef\n serviceLookup?: EntityLookup\n professionalLookup?: EntityLookup\n locationLookup?: EntityLookup\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n financialBridge?: AgendaFinancialBridge\n scheduleBlockDefaults: {\n bufferMinutes: number\n maxConcurrent: number\n minAdvanceHours: number\n maxAdvanceDays: number\n }\n defaultCalendarView: string\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nexport function resolveConfig(options?: AgendaPluginOptions): ResolvedAgendaConfig {\n return {\n modules: {\n workingHours: options?.modules?.workingHours !== false,\n confirmations: options?.modules?.confirmations !== false,\n conflictDetection: options?.modules?.conflictDetection !== false,\n dragAndDrop: options?.modules?.dragAndDrop !== false,\n locationSelection: options?.modules?.locationSelection === true,\n financial: options?.modules?.financial ?? !!options?.financialBridge,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n bookingKind: options?.bookingKind ?? 'appointment',\n orderKind: options?.orderKind ?? 'service_order',\n scheduleKind: options?.scheduleKind ?? 'working_hours',\n statuses: options?.statuses ?? DEFAULT_STATUSES,\n bookingTypes: options?.bookingTypes ?? DEFAULT_BOOKING_TYPES,\n businessHours: options?.businessHours ?? { startTime: '07:00', endTime: '21:00' },\n slotDuration: options?.slotDuration ?? 30,\n professionalKind: options?.professionalKind ?? 'staff',\n clientKind: options?.clientKind ?? 'customer',\n autoCreateOrder: options?.autoCreateOrder !== false,\n locations: options?.locations ?? [],\n confirmationChannels: options?.confirmationChannels ?? [],\n contactLookup: options?.contactLookup,\n clientEntityDef: options?.clientEntityDef,\n serviceLookup: options?.serviceLookup,\n professionalLookup: options?.professionalLookup,\n locationLookup: options?.locationLookup,\n onEntityClick: options?.onEntityClick,\n financialBridge: options?.financialBridge,\n scheduleBlockDefaults: {\n bufferMinutes: options?.scheduleBlockDefaults?.bufferMinutes ?? 0,\n maxConcurrent: options?.scheduleBlockDefaults?.maxConcurrent ?? 1,\n minAdvanceHours: options?.scheduleBlockDefaults?.minAdvanceHours ?? 0,\n maxAdvanceDays: options?.scheduleBlockDefaults?.maxAdvanceDays ?? 60,\n },\n defaultCalendarView: options?.defaultCalendarView ?? 'resourceTimeGridWeek',\n }\n}\n","import { createPluginContext } from '@fayz-ai/saas'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\n\nconst ctx = createPluginContext<ResolvedAgendaConfig, AgendaDataProvider, AgendaUIState>('AgendaPage')\n\nexport const AgendaContextProvider = ctx.ContextProvider\nexport const useAgendaConfig = ctx.useConfig\nexport const useAgendaProvider = ctx.useProvider\nexport const useAgendaStore = ctx.useStore\n","/**\n * Injects agenda calendar CSS at runtime.\n * This ensures styles work both in symlinked dev mode and when consumed\n * as a built package (where CSS side-effect imports are extracted by tsup\n * and not automatically loaded).\n */\n\nconst STYLE_ID = 'saas-agenda-calendar-styles'\n\nconst css = /* css */ `\n/* Dark mode content background — uses the content token */\n.dark .agenda-calendar,\n.dark .agenda-calendar .fc,\n.dark .agenda-calendar .fc-view-harness,\n.dark .agenda-calendar .fc-timegrid,\n.dark .agenda-calendar .fc-scrollgrid,\n.dark .agenda-calendar .fc-timegrid-col,\n.dark .agenda-calendar .fc-daygrid-body,\n.dark .agenda-calendar .fc-timegrid-slot-lane {\n background-color: hsl(var(--content));\n}\n\n/* FullCalendar — Google Calendar inspired theme */\n\n.agenda-calendar {\n --fc-border-color: hsl(var(--border));\n --fc-today-bg-color: transparent;\n --fc-now-indicator-color: hsl(var(--destructive));\n --fc-highlight-color: hsl(var(--primary) / 0.06);\n --fc-non-business-color: hsl(var(--muted) / 0.15);\n --fc-neutral-bg-color: transparent;\n --fc-page-bg-color: transparent;\n --fc-event-border-color: transparent;\n}\n\n.agenda-calendar .fc {\n font-family: inherit;\n background: transparent;\n}\n\n.agenda-calendar .fc .fc-view-harness {\n background: transparent;\n}\n\n/* ── Column headers ── */\n.agenda-calendar .fc-col-header-cell {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n border-left: none;\n border-right: none;\n border-top: none;\n}\n\n.agenda-calendar .fc-col-header-cell-cushion {\n padding: 8px 4px;\n font-weight: 400;\n font-size: 0.7rem;\n color: hsl(var(--muted-foreground));\n text-decoration: none;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n/* Today's column header */\n.agenda-calendar .fc-day-today .fc-col-header-cell-cushion {\n color: hsl(var(--primary));\n font-weight: 600;\n}\n\n/* Resource header (professional columns) */\n.agenda-calendar .fc .fc-resource-header {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n}\n\n/* ── Time slots — compact ── */\n.agenda-calendar .fc-timegrid-slot {\n height: 1.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.4);\n}\n\n.agenda-calendar .fc-timegrid-slot-label {\n vertical-align: top;\n border: none;\n}\n\n.agenda-calendar .fc-timegrid-slot-label-cushion {\n font-size: 0.65rem;\n color: hsl(var(--muted-foreground) / 0.7);\n padding: 1px 8px 0 0;\n}\n\n/* Half-hour lines lighter */\n.agenda-calendar .fc-timegrid-slot-minor {\n border-bottom-style: none;\n}\n\n/* Column dividers */\n.agenda-calendar .fc-timegrid-col {\n border-right: 1px solid hsl(var(--border) / 0.5);\n}\n\n/* ── Events ── */\n.agenda-calendar .fc-event {\n border-radius: 6px;\n border-width: 0;\n border-left: 4px solid;\n cursor: pointer;\n transition: opacity 0.15s, box-shadow 0.15s, backdrop-filter 0.15s;\n font-size: 0.7rem;\n line-height: 1.3;\n margin: 0 2px;\n overflow: hidden;\n backdrop-filter: blur(8px) saturate(140%);\n -webkit-backdrop-filter: blur(8px) saturate(140%);\n}\n\n.agenda-calendar .fc-event .fc-event-main {\n background: inherit;\n border-radius: inherit;\n overflow: hidden;\n}\n\n.agenda-calendar .fc-event:not(.fc-bg-event):hover {\n opacity: 0.92;\n box-shadow: 0 2px 8px rgba(0,0,0,0.12);\n backdrop-filter: blur(12px) saturate(160%);\n -webkit-backdrop-filter: blur(12px) saturate(160%);\n}\n\n.agenda-calendar .fc-bg-event {\n pointer-events: none;\n}\n\n/* ── Now indicator ── */\n.agenda-calendar .fc-timegrid-now-indicator-line {\n border-color: hsl(var(--destructive));\n border-width: 2px;\n}\n\n.agenda-calendar .fc-timegrid-now-indicator-arrow {\n border-top-color: hsl(var(--destructive));\n}\n\n/* ── Month view ── */\n.agenda-calendar .fc-daygrid-day-number {\n font-size: 0.8rem;\n padding: 4px 8px;\n text-decoration: none;\n color: hsl(var(--foreground));\n}\n\n.agenda-calendar .fc-daygrid-day.fc-day-today .fc-daygrid-day-number {\n background-color: hsl(var(--primary));\n color: hsl(var(--primary-foreground));\n border-radius: 50%;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n}\n\n/* ── Selection ── */\n.agenda-calendar .fc-highlight {\n background: hsl(var(--primary) / 0.08);\n}\n\n/* ── Links ── */\n.agenda-calendar .fc a {\n text-decoration: none;\n color: inherit;\n}\n\n/* ── Scrollbar ── */\n.agenda-calendar .fc-scroller {\n scrollbar-width: thin;\n scrollbar-color: hsl(var(--muted-foreground) / 0.12) transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar {\n width: 6px;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-thumb {\n background: hsl(var(--muted-foreground) / 0.12);\n border-radius: 3px;\n}\n\n/* ── Clean up borders ── */\n.agenda-calendar .fc .fc-timegrid {\n border: none;\n}\n\n.agenda-calendar .fc-scrollgrid {\n border: none !important;\n}\n\n.agenda-calendar .fc-scrollgrid td:last-child {\n border-right: none;\n}\n\n/* ── Unavailable time background — opaque/disabled feel ── */\n.agenda-calendar .fc-unavailable-bg {\n background: hsl(var(--muted-foreground) / 0.08) !important;\n background-image: repeating-linear-gradient(\n 45deg,\n transparent,\n transparent 4px,\n hsl(var(--muted-foreground) / 0.04) 4px,\n hsl(var(--muted-foreground) / 0.04) 8px\n ) !important;\n border-radius: 0;\n border-left: none !important;\n}\n\n/* ── Location label on schedule blocks ── */\n.agenda-calendar .fc-location-label {\n background: transparent !important;\n border: none !important;\n border-left-width: 0 !important;\n cursor: default !important;\n pointer-events: none;\n box-shadow: none !important;\n z-index: 1 !important;\n margin: 0 4px !important;\n font-weight: 500 !important;\n}\n\n.agenda-calendar .fc-location-label .fc-event-main {\n padding: 0 !important;\n}\n\n/* Week view day header with date */\n.agenda-calendar .fc-timegrid .fc-col-header-cell {\n padding: 4px 0;\n}\n\n/* ── Alternating resource column backgrounds ── */\n.agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.08) !important;\n}\n\n/* Resource group header separator — stronger border between professionals */\n.agenda-calendar .fc-resource-group {\n border-left: 2px solid hsl(var(--border));\n}\n\n/* Also stripe the resource header label for the alt group */\n.agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.06) !important;\n}\n`\n\nlet injected = false\n\nexport function injectCalendarStyles(): void {\n if (injected) return\n if (typeof document === 'undefined') return\n\n // Check if already present (e.g. from CSS import in dev mode)\n if (document.getElementById(STYLE_ID)) {\n injected = true\n return\n }\n\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = css\n document.head.appendChild(style)\n injected = true\n}\n","import { usePluginPrefs } from '@fayz-ai/saas'\n\nconst DEFAULTS = {\n startTime: '07:00',\n endTime: '21:00',\n}\n\nexport function useAgendaSettings() {\n const prefs = usePluginPrefs('agenda', DEFAULTS)\n\n return {\n startTime: prefs.get('startTime'),\n endTime: prefs.get('endTime'),\n setStartTime: (v: string) => prefs.set('startTime', v),\n setEndTime: (v: string) => prefs.set('endTime', v),\n }\n}\n","import React, { useMemo } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\ninterface MiniCalendarProps {\n selectedDate: Date\n onDateSelect: (date: Date) => void\n onMonthChange?: (date: Date) => void\n}\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nexport function MiniCalendar({ selectedDate, onDateSelect, onMonthChange }: MiniCalendarProps) {\n const locale = getCurrentLocale()\n const [viewMonth, setViewMonth] = React.useState(() => new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n\n const monthLabel = viewMonth.toLocaleDateString(toDateLocale(locale), { month: 'long', year: 'numeric' })\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < startOffset; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n while (cells.length % 7 !== 0) cells.push(null)\n\n const rows: (Date | null)[][] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function prevMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function nextMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function handleClick(date: Date) {\n onDateSelect(date)\n }\n\n return (\n <div className=\"select-none\">\n {/* Month header */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={prevMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button onClick={nextMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-0.5\">\n {dayLabels.map((label, i) => (\n <div key={i} className=\"flex h-6 w-6 items-center justify-center text-[10px] font-medium text-muted-foreground mx-auto\">\n {label}\n </div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map((date, di) => {\n if (!date) return <div key={di} className=\"h-6 w-6 mx-auto\" />\n const selected = isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button\n key={di}\n onClick={() => handleClick(date)}\n className={`flex h-6 w-6 items-center justify-center rounded-full text-[11px] mx-auto transition-colors ${\n selected\n ? 'bg-primary text-primary-foreground'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : 'hover:bg-muted text-foreground'\n }`}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, Plus } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Reusable search combobox with keyboard navigation + optional create\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOption {\n id: string\n label: string\n subtitle?: string\n price?: number\n data?: Record<string, unknown>\n}\n\ninterface SearchComboboxProps {\n value: string\n onChange: (value: string) => void\n onSelect: (option: ComboboxOption) => void\n options: ComboboxOption[]\n placeholder?: string\n autoFocus?: boolean\n onBlurEmpty?: () => void\n renderRight?: (option: ComboboxOption) => React.ReactNode\n /** Show a \"+ Create ...\" option when search has no exact match */\n allowCreate?: boolean\n /** Called when user clicks the create option. Receives the current search text. */\n onCreateNew?: (searchText: string) => void\n /** Label for the create option (default: 'Create') */\n createLabel?: string\n className?: string\n /** Minimal style — no border/bg, just underline on focus. For inline use. */\n minimal?: boolean\n /** Inline label shown when collapsed. Click reveals the search input. */\n inlineLabel?: string\n /** Icon for the inline label: 'search' (default) or 'plus' (for \"add\" actions) */\n inlineIcon?: 'search' | 'plus'\n /** Show a loading skeleton in the dropdown while results are being fetched */\n loading?: boolean\n /** Called when the input gains focus */\n onFocus?: () => void\n}\n\nexport function SearchCombobox({\n value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty,\n renderRight, allowCreate, onCreateNew, createLabel = 'Create', className, minimal, inlineLabel, inlineIcon = 'search',\n loading, onFocus: onFocusProp,\n}: SearchComboboxProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(-1)\n const [expanded, setExpanded] = useState(!inlineLabel)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n // When value is set externally (e.g. edit mode), auto-expand; collapse when cleared\n useEffect(() => {\n if (value && inlineLabel) setExpanded(true)\n if (!value && inlineLabel && !open) setExpanded(false)\n }, [value, open])\n\n function updateRect() {\n if (wrapperRef.current) setDropRect(wrapperRef.current.getBoundingClientRect())\n }\n\n // Show create option only when dropdown is open, has text, and no exact match\n const showCreate = open && allowCreate && onCreateNew && value.trim().length > 0 &&\n !options.some((o) => o.label.toLowerCase() === value.trim().toLowerCase())\n\n const totalItems = options.length + (showCreate ? 1 : 0)\n\n useEffect(() => { setActiveIndex(-1) }, [options])\n useEffect(() => {\n if ((options.length > 0 || showCreate || loading) && document.activeElement === inputRef.current) setOpen(true)\n }, [options, showCreate, loading])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!open || totalItems === 0) {\n if (e.key === 'ArrowDown' && totalItems > 0) {\n e.preventDefault()\n setOpen(true)\n setActiveIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % totalItems)\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1))\n break\n case 'Enter':\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < options.length) {\n onSelect(options[activeIndex])\n setOpen(false)\n setActiveIndex(-1)\n } else if (showCreate && activeIndex === options.length) {\n onCreateNew?.(value.trim())\n setOpen(false)\n setActiveIndex(-1)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n setActiveIndex(-1)\n break\n }\n }, [open, options, totalItems, activeIndex, onSelect, showCreate, onCreateNew, value])\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return\n const items = listRef.current.children\n if (items[activeIndex]) (items[activeIndex] as HTMLElement).scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n function handleBlur() {\n setTimeout(() => {\n setOpen(false)\n setActiveIndex(-1)\n if (!value && onBlurEmpty) onBlurEmpty()\n if (!value && inlineLabel) setExpanded(false)\n }, 200)\n }\n\n const hasDropdown = open && (options.length > 0 || showCreate || loading)\n\n // Collapsed inline label — click to expand\n if (!expanded && inlineLabel) {\n const isPlus = inlineIcon === 'plus'\n return (\n <button type=\"button\" onClick={() => { setExpanded(true); setTimeout(() => inputRef.current?.focus(), 50) }}\n className={`flex items-center gap-1.5 w-full text-left text-sm py-1.5 pl-2 transition-colors ${\n isPlus ? 'text-primary hover:text-primary/80' : 'text-muted-foreground hover:text-foreground'\n } ${className ?? ''}`}>\n {isPlus && <Plus className=\"h-3.5 w-3.5 shrink-0\" />}\n {inlineLabel}\n </button>\n )\n }\n\n return (\n <div ref={wrapperRef} className={`relative ${className ?? ''}`}>\n {!minimal && (\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => { onChange(e.target.value); updateRect(); setOpen(true) }}\n onFocus={() => { updateRect(); onFocusProp?.(); if (options.length > 0 || showCreate || loading) setOpen(true) }}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n className={minimal\n ? 'w-full bg-transparent pl-2 pr-3 py-1.5 text-sm placeholder:text-muted-foreground focus:outline-none border-b border-transparent hover:border-border focus:border-foreground transition-colors'\n : 'w-full rounded-lg border bg-background pl-8 pr-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring'\n }\n role=\"combobox\"\n aria-expanded={hasDropdown}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `combobox-opt-${activeIndex}` : undefined}\n />\n {hasDropdown && dropRect && createPortal(\n <div ref={listRef} role=\"listbox\" data-modal-passthrough\n style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface max-h-52 overflow-y-auto rounded-lg border bg-popover shadow-lg py-0.5 animate-in fade-in zoom-in-95 duration-100\">\n {loading && options.length === 0 && (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5 animate-spin shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" />\n <path d=\"M14.5 8a6.5 6.5 0 00-6.5-6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span>Buscando…</span>\n </div>\n )}\n {options.map((opt, i) => (\n <div key={opt.id} id={`combobox-opt-${i}`} role=\"option\" aria-selected={i === activeIndex}\n onMouseDown={(e) => { e.preventDefault(); onSelect(opt); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(i)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors ${\n i === activeIndex ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate font-medium\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[11px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n {renderRight && <div className=\"shrink-0\">{renderRight(opt)}</div>}\n </div>\n ))}\n {showCreate && (\n <div id={`combobox-opt-${options.length}`} role=\"option\" aria-selected={activeIndex === options.length}\n onMouseDown={(e) => { e.preventDefault(); onCreateNew?.(value.trim()); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(options.length)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors border-t ${\n activeIndex === options.length ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span>{createLabel} “<span className=\"font-medium\">{value.trim()}</span>”</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, Check, Banknote, QrCode, CreditCard, ArrowRightLeft, FileCheck, ExternalLink } from 'lucide-react'\nimport { useAgendaConfig } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { BookingPaymentDetail } from '../financial-bridge'\n\n// ---------------------------------------------------------------------------\n// Payment method type visuals (mirrors financial PaymentModal)\n// ---------------------------------------------------------------------------\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n cash: Banknote, pix: QrCode, credit_card: CreditCard, debit_card: CreditCard,\n bank_transfer: ArrowRightLeft, check: FileCheck,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n cash: 'border-success/30 bg-success/5 hover:bg-success/10 data-[active=true]:border-success data-[active=true]:bg-success/15',\n pix: 'border-teal-500/30 bg-teal-500/5 hover:bg-teal-500/10 data-[active=true]:border-teal-500 data-[active=true]:bg-teal-500/15',\n credit_card: 'border-info/30 bg-info/5 hover:bg-info/10 data-[active=true]:border-info data-[active=true]:bg-info/15',\n debit_card: 'border-magic/30 bg-magic/5 hover:bg-magic/10 data-[active=true]:border-magic data-[active=true]:bg-magic/15',\n bank_transfer: 'border-warning/30 bg-warning/5 hover:bg-warning/10 data-[active=true]:border-warning data-[active=true]:bg-warning/15',\n check: 'border-input/30 bg-muted/5 hover:bg-muted/10 data-[active=true]:border-input data-[active=true]:bg-muted/15',\n}\n\nconst ICON_COLORS: Record<string, string> = {\n cash: 'text-success', pix: 'text-teal-500', credit_card: 'text-info',\n debit_card: 'text-magic', bank_transfer: 'text-warning', check: 'text-muted-foreground',\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ninterface Props {\n orderId: string\n orderTotal: number\n services?: Array<{ name: string; price: number; durationMinutes: number }>\n onClose: () => void\n onPaymentChange?: () => void\n formatCurrency: (amount: number) => string\n /** Render inline (no portal overlay) — for embedding in tabs */\n inline?: boolean\n}\n\nexport function BookingPaymentPanel({ orderId, orderTotal, services, onClose, onPaymentChange, formatCurrency, inline }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const bridge = config.financialBridge!\n\n const [visible, setVisible] = useState(false)\n const [loading, setLoading] = useState(true)\n const [detail, setDetail] = useState<BookingPaymentDetail | null>(null)\n\n // Payment form\n const [selectedTypeId, setSelectedTypeId] = useState('')\n const [paymentTypes, setPaymentTypes] = useState<Array<{ id: string; name: string; transactionType?: string }>>([])\n const [bankAccounts, setBankAccounts] = useState<Array<{ id: string; name: string; accountType: string }>>([])\n const [filteredMethods, setFilteredMethods] = useState<Array<{ id: string; name: string }>>([])\n const [selectedBankId, setSelectedBankId] = useState('')\n const [paymentMethodId, setPaymentMethodId] = useState('')\n const [cardBrand, setCardBrand] = useState('')\n const [cardInstallments, setCardInstallments] = useState(1)\n const [processing, setProcessing] = useState(false)\n const [justPaid, setJustPaid] = useState(false)\n\n useEffect(() => { requestAnimationFrame(() => setVisible(true)) }, [])\n\n // Single combined fetch for all initial data\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n Promise.all([\n bridge.getPaymentDetail(orderId).catch(() => null),\n bridge.getPaymentMethodTypes().catch(() => [] as typeof paymentTypes),\n bridge.getBankAccounts().catch(() => [] as typeof bankAccounts),\n ]).then(([d, types, accounts]) => {\n if (cancelled) return\n setDetail(d)\n setPaymentTypes(types)\n setBankAccounts(accounts)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [orderId])\n\n function handleClose() {\n setVisible(false)\n setTimeout(onClose, 200)\n }\n\n const selectedType = paymentTypes.find((t) => t.id === selectedTypeId)\n const txType = selectedType?.transactionType ?? ''\n const needsBank = ['bank_transfer', 'pix', 'check'].includes(txType)\n const needsCard = txType === 'credit_card' || txType === 'debit_card'\n const needsCardInstallments = txType === 'credit_card'\n\n function handleSelectType(typeId: string) {\n setSelectedTypeId(typeId)\n setSelectedBankId('')\n setPaymentMethodId('')\n setCardBrand('')\n setCardInstallments(1)\n // Fetch specific payment methods for this type\n if (bridge.getPaymentMethods) {\n bridge.getPaymentMethods(typeId).then(setFilteredMethods).catch(() => setFilteredMethods([]))\n }\n }\n\n async function handleCheckout() {\n if (!selectedTypeId) return\n setProcessing(true)\n try {\n const result = await bridge.checkout(orderId, {\n paymentMethodTypeId: selectedTypeId,\n paymentMethodId: paymentMethodId || undefined,\n bankAccountId: needsBank ? selectedBankId || undefined : undefined,\n cardBrand: needsCard ? cardBrand || undefined : undefined,\n cardInstallments: needsCardInstallments ? cardInstallments : undefined,\n })\n setDetail(result)\n setJustPaid(true)\n onPaymentChange?.()\n // Show confirmation animation, then transition to summary\n setTimeout(() => setJustPaid(false), 2200)\n } catch { /* toast */ }\n setProcessing(false)\n }\n\n const isPaid = detail?.status === 'paid'\n\n const content = (\n <div className=\"px-5 py-4 space-y-4\">\n\n {/* Loading */}\n {loading && (\n <div className=\"space-y-3 py-2\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n )}\n\n {/* Just paid — confirmation animation */}\n {!loading && isPaid && justPaid && (\n <div className=\"text-center py-8 space-y-2 animate-in fade-in zoom-in-95 duration-300\">\n <div className=\"flex h-14 w-14 mx-auto items-center justify-center rounded-full bg-success/10 animate-bounce\" style={{ animationDuration: '600ms', animationIterationCount: '2' }}>\n <Check className=\"h-7 w-7 text-success\" />\n </div>\n <p className=\"text-sm font-semibold text-success\">{t('agenda.payment.checkoutComplete')}</p>\n <p className=\"text-xs text-muted-foreground\">{formatCurrency(detail!.totalAmount)}</p>\n </div>\n )}\n\n {/* Invoice summary — shown after animation or when returning to an already-paid/pending booking */}\n {!loading && detail && detail.status !== 'none' && !justPaid && (\n <div className=\"space-y-3 animate-in fade-in duration-300\">\n {/* Movement rows with inline status badge */}\n {detail.movements.length > 0 ? (\n <div className=\"space-y-1.5\">\n {detail.movements.map((mov) => {\n const methodName = mov.paymentMethodTypeName\n const txKey = (methodName ?? '').toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[txKey] ?? Banknote\n const iconColor = ICON_COLORS[txKey] ?? 'text-muted-foreground'\n const isMovPaid = mov.status === 'paid'\n const isPartial = mov.status === 'partial'\n const isOverdue = mov.status === 'overdue'\n\n return (\n <div key={mov.id} className=\"flex items-center gap-3 rounded-lg border px-3 py-2.5\">\n <Icon className={`h-4 w-4 shrink-0 ${isMovPaid ? iconColor : 'text-muted-foreground'}`} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {methodName ?? '—'}\n {mov.cardBrand ? ` · ${mov.cardBrand}` : ''}\n {mov.cardInstallments && mov.cardInstallments > 1 ? ` ${mov.cardInstallments}x` : ''}\n </p>\n <p className=\"text-[10px] text-muted-foreground\">\n {mov.paymentDate ?? mov.dueDate}\n {detail.movements.length > 1 && mov.installmentNumber ? ` · ${t('agenda.payment.installment')} ${mov.installmentNumber}` : ''}\n </p>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {isMovPaid && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success\">\n <Check className=\"h-2.5 w-2.5\" /> {t('agenda.payment.paid')}\n </span>\n )}\n {isPartial && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning\">\n ! {formatCurrency(mov.paidAmount)}/{formatCurrency(mov.amount)}\n </span>\n )}\n {isOverdue && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-[10px] font-medium text-destructive\">\n ! {t('agenda.payment.overdue')}\n </span>\n )}\n {mov.status === 'pending' && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t('agenda.payment.pending')}\n </span>\n )}\n <span className=\"text-sm font-semibold\">{formatCurrency(mov.paidAmount || mov.amount)}</span>\n </div>\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex items-center justify-between text-sm px-1\">\n <span className=\"text-muted-foreground\">{t('agenda.payment.total')}</span>\n <span className=\"font-semibold\">{formatCurrency(detail.totalAmount)}</span>\n </div>\n )}\n\n {/* Invoice ref + link */}\n <div className=\"flex items-center justify-between\">\n {detail.referenceNumber && (\n <span className=\"text-[10px] font-mono text-muted-foreground\">#{detail.referenceNumber}</span>\n )}\n <a\n href={`#/financial/receivables/detail/${detail.invoiceId}`}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-primary hover:underline ml-auto\"\n >\n {t('agenda.payment.viewInvoice')}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n </div>\n )}\n\n {/* Checkout view — only when no invoice exists yet */}\n {!loading && (!detail || detail.movements.length === 0) && (\n <>\n {/* Service summary */}\n {services && services.length > 0 && (\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.serviceSummary')}</p>\n <div className=\"space-y-0.5\">\n {services.map((svc, i) => (\n <div key={i} className=\"flex items-center justify-between text-sm py-1\">\n <span className=\"truncate\">{svc.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatCurrency(svc.price)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Total */}\n <div className=\"flex items-center justify-between text-sm font-semibold pt-2 border-t\">\n <span>{t('agenda.payment.total')}</span>\n <span>{formatCurrency(orderTotal)}</span>\n </div>\n\n {/* Payment method grid */}\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.paymentMethod')}</p>\n {paymentTypes.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-input bg-muted/30 px-3 py-3 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('agenda.payment.noMethods')}</p>\n <a href=\"#/financial/settings\" className=\"mt-1.5 inline-block text-xs font-medium text-primary hover:underline\">\n {t('agenda.payment.configureMethods')} →\n </a>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1.5\">\n {paymentTypes.map((pt) => {\n const ptTx = pt.transactionType ?? pt.name.toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[ptTx] ?? Banknote\n const colorClass = TYPE_COLORS[ptTx] ?? TYPE_COLORS.cash\n const iconColor = ICON_COLORS[ptTx] ?? ICON_COLORS.cash\n const isActive = selectedTypeId === pt.id\n return (\n <button\n key={pt.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => handleSelectType(pt.id)}\n className={`flex flex-col items-center gap-1 rounded-lg border p-2.5 text-[10px] font-medium transition-all ${colorClass}`}\n >\n <Icon className={`h-4 w-4 ${iconColor}`} />\n <span className=\"truncate w-full text-center\">{pt.name}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Extra fields based on payment type */}\n {selectedTypeId && (\n <div className=\"space-y-3\">\n {/* Specific payment method (filtered by type) */}\n {filteredMethods.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">\n {needsCard ? t('agenda.payment.card') : t('agenda.payment.method')}\n </label>\n <select value={paymentMethodId} onChange={(e) => setPaymentMethodId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.select')}</option>\n {filteredMethods.map((m) => <option key={m.id} value={m.id}>{m.name}</option>)}\n </select>\n </div>\n )}\n\n {/* Card brand + installments */}\n {needsCard && (\n <div className={`grid gap-2.5 ${needsCardInstallments ? 'grid-cols-2' : 'grid-cols-1'}`}>\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardBrand')}</label>\n <select value={cardBrand} onChange={(e) => setCardBrand(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectBrand')}</option>\n {['Visa', 'Mastercard', 'American Express', 'Elo', 'Hipercard', 'Diners Club'].map((b) => (\n <option key={b} value={b}>{b}</option>\n ))}\n </select>\n </div>\n {needsCardInstallments && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardInstallments')}</label>\n <select value={cardInstallments} onChange={(e) => setCardInstallments(Number(e.target.value))}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n {Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (\n <option key={n} value={n}>{n}x {n > 1 ? formatCurrency(orderTotal / n) : ''}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Bank account */}\n {needsBank && bankAccounts.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.bankAccount')}</label>\n <select value={selectedBankId} onChange={(e) => setSelectedBankId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectAccount')}</option>\n {bankAccounts.map((a) => (\n <option key={a.id} value={a.id}>{a.name}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Confirm button */}\n <button\n type=\"button\"\n onClick={handleCheckout}\n disabled={processing || !selectedTypeId}\n className=\"w-full rounded-lg bg-primary border border-primary py-2.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\"\n >\n {processing\n ? t('agenda.payment.checkingOut')\n : `${t('agenda.payment.checkout')} ${formatCurrency(orderTotal)}`\n }\n </button>\n </>\n )}\n </div>\n )\n\n if (inline) return content\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center transition-colors duration-200\"\n style={{ backgroundColor: visible ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)' }}\n onClick={handleClose}\n >\n <div\n className=\"w-full max-w-md rounded-xl border bg-card shadow-2xl mx-4 transition-all duration-200 max-h-[90vh] overflow-y-auto\"\n style={{ opacity: visible ? 1 : 0, transform: visible ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(8px)' }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between px-5 py-4 border-b sticky top-0 bg-card z-10\">\n <h3 className=\"text-base font-semibold\">{t('agenda.payment.title')}</h3>\n <button onClick={handleClose} className=\"p-1 text-muted-foreground hover:text-foreground transition-colors\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {content}\n </div>\n </div>,\n document.body,\n )\n}\n","// ---------------------------------------------------------------------------\n// Agenda Plugin — Pure TypeScript types\n// Zero dependencies. Maps to saas_core archetype tables.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\n/** Booking status lifecycle */\nexport type BookingStatus =\n | 'scheduled'\n | 'confirmed'\n | 'in_progress'\n | 'completed'\n | 'cancelled'\n | 'no_show'\n\n/** Confirmation outreach status */\nexport type ConfirmationStatus = 'pending' | 'sent' | 'confirmed' | 'declined'\n\n/** Booking type identifier — extensible via string literal union */\nexport type BookingTypeId = 'appointment' | 'task' | 'out_of_office' | 'block' | (string & {})\n\n/** Configuration for a booking type (event type) */\nexport interface BookingTypeConfig {\n id: BookingTypeId\n label: string\n icon: string\n color: string\n fields: {\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n }\n requiresServices: boolean\n requiresClient: boolean\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A booking service line item (from saas_core.booking_items) */\nexport interface BookingService {\n id: string\n serviceId: string | null\n name: string\n durationMinutes: number\n price: number\n assigneeId: string | null\n}\n\n/** Calendar booking — the main entity rendered on the calendar (from v_bookings view on orders) */\nexport interface CalendarBooking {\n id: string\n tenantId: string\n kind: string\n /** Lifecycle stage: booked, invoiced, paid, etc. */\n stage?: string\n /** Financial direction: credit, debit, null */\n direction?: string | null\n startsAt: string\n endsAt: string | null\n status: BookingStatus\n notes: string | null\n /** In unified model, orderId === id (the booking IS the order) */\n orderId: string | null\n locationId: string | null\n metadata: Record<string, unknown>\n\n // Client (party)\n clientId: string | null\n clientName: string | null\n clientPhone: string | null\n clientEmail: string | null\n clientAvatarUrl: string | null\n\n // Professional (assignee)\n professionalId: string | null\n professionalName: string | null\n professionalAvatarUrl: string | null\n\n // Location\n locationName: string | null\n\n // Order totals\n orderTotal: number | null\n orderStatus: string | null\n /** Payment status from financial bridge (enriched at runtime) */\n paymentStatus?: import('./financial-bridge').BookingPaymentStatus\n\n // Aggregated services\n services: BookingService[] | null\n totalDurationMinutes: number | null\n\n createdAt: string\n updatedAt: string\n}\n\n/** Professional / staff resource for the calendar */\nexport interface Professional {\n id: string\n name: string\n avatarUrl: string | null\n locationId: string | null\n locationName: string | null\n isActive: boolean\n}\n\n/** Working hours schedule (from saas_core.schedules) */\nexport interface Schedule {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n locationId: string | null\n dayOfWeek: number | null\n specificDate: string | null\n startsAt: string\n endsAt: string\n isActive: boolean\n metadata: Record<string, unknown>\n}\n\n/** Available time slot */\nexport interface TimeSlot {\n start: string\n end: string\n}\n\n/** Confirmation record stored in booking metadata */\nexport interface ConfirmationRecord {\n channel: string\n sentAt: string\n status: ConfirmationStatus\n confirmedAt?: string\n}\n\n// ============================================================\n// STATUS CONFIGURATION\n// ============================================================\n\n/**\n * When a status is available for selection relative to the booking date.\n * - 'always' — any date (e.g. scheduled, confirmed, cancelled)\n * - 'today_or_past' — booking is today or earlier (e.g. completed, no_show)\n * - 'today_only' — booking is today (e.g. in_progress)\n */\nexport type StatusAvailability = 'always' | 'today_or_past' | 'today_only'\n\nexport interface StatusConfig {\n value: string\n label: string\n color: string\n /** When this status can be selected (default: 'always') */\n availableWhen?: StatusAvailability\n}\n\n/** Check if a status is available for a given booking date */\nexport function isStatusAvailable(status: StatusConfig, bookingStartsAt: string): boolean {\n const when = status.availableWhen ?? 'always'\n if (when === 'always') return true\n const bookingDate = bookingStartsAt.slice(0, 10)\n const today = new Date().toISOString().slice(0, 10)\n if (when === 'today_or_past') return bookingDate <= today\n if (when === 'today_only') return bookingDate === today\n return true\n}\n\n// ============================================================\n// MODAL TAB EXTENSION\n// ============================================================\n\n/** Props passed to every booking modal tab component */\nexport interface BookingModalTabProps {\n bookingId?: string\n clientId: string\n orderId: string | null\n services: Array<{ name: string; price: number; durationMinutes: number }>\n formatCurrency: (amount: number) => string\n onDataChange?: () => void\n}\n\n/** A tab registered in the booking edit modal */\nexport interface BookingModalTab {\n id: string\n label: string\n icon: string\n order: number\n component: React.ComponentType<BookingModalTabProps>\n visible?: (ctx: { mode: 'create' | 'edit'; clientId?: string; orderId?: string }) => boolean\n}\n\n// ============================================================\n// INPUT TYPES (create / mutate)\n// ============================================================\n\nexport interface CreateBookingInput {\n kind?: BookingTypeId\n clientId: string\n professionalId: string\n locationId?: string\n startsAt: string\n notes?: string\n services: CreateBookingServiceInput[]\n}\n\nexport interface CreateBookingServiceInput {\n serviceId: string\n name: string\n durationMinutes: number\n price: number\n assigneeId?: string\n}\n\nexport interface UpdateBookingInput {\n clientId?: string\n professionalId?: string\n locationId?: string\n startsAt?: string\n endsAt?: string\n status?: BookingStatus\n notes?: string\n services?: CreateBookingServiceInput[]\n}\n\nexport interface SaveScheduleInput {\n assigneeId: string\n locationId?: string\n dayOfWeek?: number\n specificDate?: string\n startsAt: string\n endsAt: string\n isActive?: boolean\n metadata?: Record<string, unknown>\n}\n\n// ============================================================\n// QUERY / FILTER TYPES\n// ============================================================\n\nexport interface BookingQuery {\n dateRange: { start: string; end: string }\n professionalIds?: string[]\n locationId?: string\n statuses?: string[]\n kind?: string\n}\n\nexport interface ConflictCheckParams {\n assigneeId: string\n startsAt: string\n endsAt: string\n excludeBookingId?: string\n}\n\nexport interface AvailableSlotsParams {\n assigneeId: string\n date: string\n durationMinutes: number\n slotInterval?: number\n}\n","import React, { useState, useEffect, useMemo, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock, AlertTriangle, X, User, Briefcase, FileText, CircleDot, Plus, MapPin, Calendar, DollarSign, CheckSquare, Ban, Check, HandCoins } from 'lucide-react'\n\nconst BOOKING_TYPE_ICONS: Record<string, React.ElementType> = {\n Calendar, CheckSquare, Ban,\n}\nimport {\n Modal, ModalContent, ModalTitle,\n} from '@fayz-ai/ui'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { SearchCombobox, type ComboboxOption } from './SearchCombobox'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { BookingPaymentPanel } from './BookingPaymentPanel'\nimport { CrudDetailPage } from '@fayz-ai/saas'\nimport { CrudFormPage } from '@fayz-ai/saas'\nimport { Button } from '@fayz-ai/ui'\nimport { useAgendaConfig, useAgendaProvider, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CreateBookingInput, BookingTypeId } from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtCurrency(amount: number, locale: string, code: string): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\nfunction formatCompactDate(dateStr: string, locale: string): string {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(locale === 'pt-BR' ? 'pt-BR' : 'en-US', {\n weekday: 'short', month: 'short', day: 'numeric',\n })\n}\n\ninterface ServiceItem { serviceId: string; name: string; durationMinutes: number; price: number }\n\n// ---------------------------------------------------------------------------\n// Inline editable number — allows clearing, commits on blur/enter\n// ---------------------------------------------------------------------------\n\nfunction InlineNumber({ value, onChange, min = 0, step = 1, className, disabled, tooltip }: {\n value: number; onChange: (v: number) => void; min?: number; step?: number\n className?: string; disabled?: boolean; tooltip?: string\n}) {\n const [draft, setDraft] = useState(String(value))\n const [focused, setFocused] = useState(false)\n\n useEffect(() => { if (!focused) setDraft(String(value)) }, [value, focused])\n\n function commit() {\n setFocused(false)\n const v = parseFloat(draft)\n if (!isNaN(v) && v >= min) {\n onChange(v)\n } else {\n setDraft(String(value))\n }\n }\n\n const input = (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={(e) => { setFocused(true); e.target.select() }}\n onBlur={commit}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commit() } }}\n disabled={disabled}\n className={cn(\n 'text-right text-[11px] text-muted-foreground bg-transparent border-b border-transparent hover:border-muted-foreground/40 focus:border-foreground focus:outline-none tabular-nums',\n className,\n )}\n />\n )\n\n if (!tooltip) return input\n\n return (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>{input}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Custom Status Select\n// ---------------------------------------------------------------------------\n\nfunction StatusSelect({ value, onChange, statuses, bookingDate }: {\n value: string; onChange: (v: string) => void\n statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingDate?: string\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const btnRef = useRef<HTMLButtonElement>(null)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n\n function handleOpen() {\n if (btnRef.current) setDropRect(btnRef.current.getBoundingClientRect())\n setOpen((p) => !p)\n }\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button ref={btnRef} type=\"button\" onClick={handleOpen}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left w-full\">\n {current && <>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: current.color }} />\n <span>{current.label}</span>\n </>}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && dropRect && createPortal(\n <div ref={dropdownRef} data-modal-passthrough style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {statuses.map((s: any) => {\n const available = !bookingDate || isStatusAvailable(s as any, bookingDate)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2.5 px-3 py-1.5 text-sm transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Professional Select — compact inline dropdown with initials\n// ---------------------------------------------------------------------------\n\nfunction ProfessionalSelect({ value, onChange, professionals }: {\n value: string; onChange: (v: string) => void\n professionals: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = professionals.find((p) => p.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectProfessional')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {professionals.map((p: any) => (\n <button key={p.id} type=\"button\"\n onClick={() => { onChange(p.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${p.id === value ? 'bg-muted/30' : ''}`}>\n <span>{p.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Location Select — compact inline dropdown\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({ value, onChange, locations }: {\n value: string; onChange: (v: string) => void\n locations: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = locations.find((l) => l.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectLocation')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 max-h-48 overflow-y-auto\">\n {locations.map((l: any) => (\n <button key={l.id} type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${l.id === value ? 'bg-muted/30' : ''}`}>\n <span>{l.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Appointment Modal — Google Calendar-inspired compact layout\n// ---------------------------------------------------------------------------\n\ninterface Props {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n onClose: () => void\n onCreated?: (bookingId: string) => void\n}\n\nexport function AppointmentModal({ open, mode, bookingId, prefill, initialTab, onClose, onCreated }: Props) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const config = useAgendaConfig()\n const provider = useAgendaProvider()\n const initialSnapshot = useRef<string>('')\n const createBooking = useAgendaStore((s) => s.createBooking)\n const updateBooking = useAgendaStore((s) => s.updateBooking)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const agendaDateRange = useAgendaStore((s) => s.dateRange)\n const professionals = useAgendaStore((s) => s.professionals)\n const storeLocations = useAgendaStore((s) => s.locations)\n\n // --- State ---\n const [loading, setLoading] = useState(mode === 'edit')\n const [bookingType, setBookingType] = useState<BookingTypeId>(prefill?.kind ?? 'appointment')\n const [clientId, setClientId] = useState(prefill?.clientId ?? '')\n const [clientSearch, setClientSearch] = useState('')\n const [clientPhone, setClientPhone] = useState('')\n const [professionalId, setProfessionalId] = useState(prefill?.professionalId ?? '')\n const [locationId, setLocationId] = useState(prefill?.locationId ?? '')\n const [services, setServices] = useState<ServiceItem[]>([])\n const [serviceSearch, setServiceSearch] = useState('')\n const [date, setDate] = useState(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n const [startTime, setStartTime] = useState(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n const [status, setStatus] = useState('scheduled')\n const [notes, setNotes] = useState('')\n const [showNotes, setShowNotes] = useState(false)\n const [saving, setSaving] = useState(false)\n const [conflict, setConflict] = useState(false)\n const [quickCreate, setQuickCreate] = useState(false)\n const [newClientName, setNewClientName] = useState('')\n const [newClientPhone, setNewClientPhone] = useState('')\n const [newClientEmail, setNewClientEmail] = useState('')\n const [creatingClient, setCreatingClient] = useState(false)\n const [clientOptions, setClientOptions] = useState<ComboboxOption[]>([])\n const [clientSearching, setClientSearching] = useState(false)\n const [serviceOptions, setServiceOptions] = useState<ComboboxOption[]>([])\n const [initialServiceOptions, setInitialServiceOptions] = useState<ComboboxOption[]>([])\n const [editingDate, setEditingDate] = useState(false)\n const [editingTime, setEditingTime] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const [editOrderId, setEditOrderId] = useState<string | null>(null)\n const [editOrderTotal, setEditOrderTotal] = useState(0)\n const [editPaymentStatus, setEditPaymentStatus] = useState<import('../financial-bridge').BookingPaymentStatus>('none')\n const [paymentStatusLoading, setPaymentStatusLoading] = useState(false)\n const [modalTab, setModalTab] = useState<'appointment' | 'client' | 'financial'>('appointment')\n const [clientData, setClientData] = useState<Record<string, any> | null>(null)\n const [clientDataLoading, setClientDataLoading] = useState(false)\n const [clientEditing, setClientEditing] = useState(false)\n\n // Active booking type config\n const activeType = config.bookingTypes.find((bt) => bt.id === bookingType) ?? config.bookingTypes[0]\n\n // Reset form when modal opens\n useEffect(() => {\n if (!open) return\n setClientId(prefill?.clientId ?? ''); setClientSearch(''); setClientPhone('')\n setProfessionalId(prefill?.professionalId ?? ''); setLocationId(prefill?.locationId ?? ''); setServices([])\n setServiceSearch(''); setNotes(''); setStatus('scheduled'); setShowNotes(false)\n setConflict(false); setLoading(mode === 'edit')\n setQuickCreate(false); setNewClientName(''); setNewClientPhone(''); setNewClientEmail(''); setCreatingClient(false)\n setBookingType(prefill?.kind ?? 'appointment')\n setEditingDate(false); setEditingTime(false); setConfirmingDelete(false); setDeleting(false)\n setEditOrderId(null); setEditOrderTotal(0); setEditPaymentStatus('none'); setPaymentStatusLoading(false)\n setClientData(null); setClientDataLoading(false); setClientEditing(false)\n setModalTab((initialTab as 'appointment' | 'client' | 'financial') || 'appointment')\n if (!prefill?.professionalId && professionals.length === 1) setProfessionalId(professionals[0].id)\n setDate(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n setStartTime(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n }, [open])\n\n // Edit: load existing\n useEffect(() => {\n if (!open || mode !== 'edit' || !bookingId) return\n setLoading(true)\n provider.getBookingById(bookingId).then((b) => {\n if (!b) { setLoading(false); return }\n setBookingType((b.kind as BookingTypeId) ?? 'appointment')\n setClientId(b.clientId ?? ''); setClientSearch(b.clientName ?? '')\n setProfessionalId(b.professionalId ?? ''); setLocationId(b.locationId ?? '')\n setDate(b.startsAt.slice(0, 10))\n const d = new Date(b.startsAt)\n setStartTime(`${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`)\n setStatus(b.status); setNotes(b.notes ?? '')\n if (b.notes) setShowNotes(true)\n if (b.services) setServices(b.services.map((s: any) => ({\n serviceId: s.serviceId ?? '', name: s.name, durationMinutes: s.durationMinutes, price: s.price,\n })))\n setEditOrderId(b.orderId ?? null)\n setEditOrderTotal(b.orderTotal ?? 0)\n setEditPaymentStatus(b.paymentStatus ?? 'none')\n // Save initial snapshot for dirty check\n const svcSnap = b.services ? b.services.map((s: any) => ({ id: s.serviceId ?? '', dur: s.durationMinutes, price: s.price })) : []\n initialSnapshot.current = JSON.stringify({\n clientId: b.clientId ?? '', professionalId: b.professionalId ?? '', locationId: b.locationId ?? '',\n date: b.startsAt.slice(0, 10),\n startTime: `${String(new Date(b.startsAt).getHours()).padStart(2, '0')}:${String(new Date(b.startsAt).getMinutes()).padStart(2, '0')}`,\n status: b.status, notes: b.notes ?? '', services: svcSnap,\n })\n setLoading(false)\n // Resolve payment status from bridge if available\n if (b.orderId && config.financialBridge) {\n setPaymentStatusLoading(true)\n config.financialBridge.resolvePaymentStatuses([b.orderId]).then((map) => {\n const summary = map.get(b.orderId!)\n if (summary) {\n setEditPaymentStatus(summary.status)\n setEditOrderTotal(summary.totalAmount)\n }\n }).catch(() => {}).finally(() => setPaymentStatusLoading(false))\n }\n }).catch(() => setLoading(false))\n }, [open, mode, bookingId])\n\n // Fetch client data when client tab is opened\n useEffect(() => {\n if (modalTab !== 'client' || !clientId || !config.contactLookup || clientData) return\n setClientDataLoading(true)\n config.contactLookup.getById(clientId).then((result) => {\n setClientData(result?.data ?? null)\n setClientDataLoading(false)\n }).catch(() => setClientDataLoading(false))\n }, [modalTab, clientId])\n\n // Fetch initial service list when modal opens\n useEffect(() => {\n if (!open || !config.serviceLookup) return\n const lookup = config.serviceLookup\n const fetch = lookup.list ? () => lookup.list!() : () => lookup.search('')\n fetch().then((results) => {\n const opts = results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data }))\n setInitialServiceOptions(opts)\n }).catch(() => setInitialServiceOptions([]))\n }, [open])\n\n // Search effects\n useEffect(() => {\n if (!config.contactLookup || clientSearch.length < 1 || clientId) { setClientOptions([]); setClientSearching(false); return }\n setClientSearching(true)\n const timer = setTimeout(async () => {\n try {\n const results = await config.contactLookup!.search(clientSearch)\n setClientOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setClientOptions([]) }\n setClientSearching(false)\n }, 250)\n return () => clearTimeout(timer)\n }, [clientSearch, clientId])\n\n useEffect(() => {\n if (!config.serviceLookup || serviceSearch.length < 1) { setServiceOptions([]); return }\n const timer = setTimeout(async () => {\n try {\n const results = await config.serviceLookup!.search(serviceSearch)\n setServiceOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setServiceOptions([]) }\n }, 250)\n return () => clearTimeout(timer)\n }, [serviceSearch])\n\n // Computed\n const serviceDuration = services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const selectionDuration = useMemo(() => {\n if (!prefill?.startsAt || !prefill?.endsAt) return 0\n return Math.round((new Date(prefill.endsAt).getTime() - new Date(prefill.startsAt).getTime()) / 60000)\n }, [prefill?.startsAt, prefill?.endsAt])\n const totalDuration = serviceDuration > 0 ? serviceDuration : selectionDuration\n const totalPrice = services.reduce((sum, s) => sum + s.price, 0)\n const { currency } = config\n\n const endTime = useMemo(() => {\n const [h, m] = startTime.split(':').map(Number)\n const total = h * 60 + m + totalDuration\n return `${String(Math.floor(total / 60) % 24).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`\n }, [startTime, totalDuration])\n\n // Conflict check\n useEffect(() => {\n if (!professionalId || totalDuration === 0) { setConflict(false); return }\n const timer = setTimeout(() => {\n provider.checkConflict({\n assigneeId: professionalId, startsAt: `${date}T${startTime}:00`, endsAt: `${date}T${endTime}:00`, excludeBookingId: bookingId,\n }).then(setConflict).catch(() => setConflict(false))\n }, 300)\n return () => clearTimeout(timer)\n }, [professionalId, date, startTime, endTime, bookingId])\n\n function selectClient(opt: ComboboxOption) {\n setClientId(opt.id); setClientSearch(opt.label); setClientOptions([])\n setClientPhone((opt.data?.phone as string) ?? '')\n }\n function addService(opt: ComboboxOption) {\n const duration = (opt.data?.duration_minutes as number) || 60\n setServices((p) => [...p, { serviceId: opt.id, name: opt.label, durationMinutes: duration, price: opt.price ?? 0 }])\n setServiceSearch(''); setServiceOptions([])\n }\n function removeService(idx: number) { setServices((p) => p.filter((_, i) => i !== idx)) }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!canSubmit) return\n setSaving(true)\n try {\n const startsAt = new Date(`${date}T${startTime}:00`).toISOString()\n if (mode === 'create') {\n const newBooking = await createBooking({ kind: bookingType, clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })) })\n onClose()\n onCreated?.(newBooking.id)\n } else if (bookingId) {\n await updateBooking(bookingId, {\n clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined, status: status as any,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })),\n })\n onClose()\n }\n } catch { /* toast */ }\n setSaving(false)\n }\n\n async function handleDelete() {\n if (!bookingId) return\n setDeleting(true)\n try { await deleteBooking(bookingId); onClose() } catch { /* toast */ }\n setDeleting(false)\n }\n\n const isPaidBooking = editPaymentStatus === 'paid'\n\n // Dirty check — only enable Update when something changed\n const formSnapshot = useMemo(() =>\n JSON.stringify({ clientId, professionalId, locationId, date, startTime, status, notes, services: services.map((s: any) => ({ id: s.serviceId, dur: s.durationMinutes, price: s.price })) }),\n [clientId, professionalId, locationId, date, startTime, status, notes, services]\n )\n const isDirty = mode === 'create' || formSnapshot !== initialSnapshot.current\n\n const canSubmit = (\n (!activeType.requiresClient || clientId) &&\n (!activeType.fields.professional || professionalId) &&\n (!activeType.requiresServices || services.length > 0) &&\n !conflict && !saving\n )\n\n const showTabs = config.bookingTypes.length > 1\n\n return (\n <Modal open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <ModalContent size=\"lg\" noPadding>\n\n {/* ═══ TOP — type tabs + date/time ═══ */}\n <div className=\"px-5 pt-4 pb-3 shrink-0 space-y-3\">\n <ModalTitle className=\"sr-only\">\n {mode === 'create' ? t('agenda.appointment.new') : t('agenda.appointment.edit')}\n </ModalTitle>\n\n {/* Booking type tabs (create) or section tabs (edit) */}\n {showTabs && mode === 'create' ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {config.bookingTypes.map((bt) => {\n const label = t(`agenda.bookingType.${bt.id}`) || bt.label\n const isActive = bookingType === bt.id\n const BtIcon = BOOKING_TYPE_ICONS[bt.icon] ?? Calendar\n return (\n <button key={bt.id} type=\"button\" onClick={() => setBookingType(bt.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <BtIcon className=\"h-3.5 w-3.5\" />\n {label}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : mode === 'edit' && (\n (config.clientEntityDef && clientId) || (config.modules.financial && editOrderId) ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {([\n { id: 'appointment' as const, label: t(`agenda.bookingType.${bookingType}`) || activeType.label, icon: Calendar, show: true },\n { id: 'client' as const, label: t('agenda.appointment.clientTab'), icon: User, show: !!config.clientEntityDef && !!clientId },\n { id: 'financial' as const, label: t('agenda.payment.title'), icon: DollarSign, show: config.modules.financial && !!editOrderId },\n ]).filter((tab) => tab.show).map((tab) => {\n const isActive = modalTab === tab.id\n return (\n <button key={tab.id} type=\"button\" onClick={() => setModalTab(tab.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <tab.icon className=\"h-3.5 w-3.5\" />\n {tab.label}\n {tab.id === 'financial' && editPaymentStatus === 'paid' && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-success\" />\n )}\n {tab.id === 'financial' && editPaymentStatus !== 'paid' && (\n (editPaymentStatus !== 'none' || (totalPrice > 0 && date <= new Date().toISOString().slice(0, 10)))\n ) && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" />\n )}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : (\n <h2 className=\"text-sm font-semibold\">\n {t(`agenda.bookingType.${bookingType}`) || activeType.label}\n </h2>\n )\n )}\n\n {/* Date/time + professional row — hidden on financial tab */}\n {modalTab === 'appointment' && (\n <>\n <div className=\"flex items-center gap-3\">\n <Clock className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex items-center gap-1.5 text-sm flex-1 min-w-0\">\n {editingDate ? (\n <input type=\"date\" value={date} autoFocus\n onChange={(e) => { setDate(e.target.value); setEditingDate(false) }}\n onBlur={() => setEditingDate(false)}\n className=\"bg-transparent text-sm font-medium focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingDate(true)}\n className=\"px-0.5 py-0.5 font-medium border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {formatCompactDate(date, locale)}\n </button>\n )}\n {editingTime ? (\n <input type=\"time\" value={startTime} autoFocus\n onChange={(e) => { if (e.target.value) { setStartTime(e.target.value); setEditingTime(false) } }}\n onBlur={() => setEditingTime(false)}\n className=\"bg-transparent text-xs text-muted-foreground focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingTime(true)}\n className=\"px-0.5 py-0.5 text-xs text-muted-foreground border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {startTime}\n </button>\n )}\n <span className=\"text-[11px] text-muted-foreground/60\">—</span>\n <span className=\"text-[11px] text-muted-foreground/60\">{endTime}</span>\n\n {/* Professional — right-aligned on the same row */}\n {activeType.fields.professional && (\n <div className=\"ml-auto shrink-0\">\n <ProfessionalSelect value={professionalId} onChange={setProfessionalId} professionals={professionals} />\n </div>\n )}\n </div>\n </div>\n\n {conflict && (\n <div className=\"flex items-center gap-2 rounded-lg bg-destructive/10 px-3 py-1.5 text-xs text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n {t('agenda.appointment.conflict')}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* ═══ BODY ═══ */}\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n\n {/* Client tab content — reuses the same CrudDetailPage as /clients/:id */}\n {modalTab === 'client' && clientId && config.clientEntityDef && (\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {clientDataLoading ? (\n <div className=\"space-y-3 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n ) : clientData ? (\n clientEditing ? (\n <CrudFormPage\n embedded\n entityDef={config.clientEntityDef}\n mode=\"edit\"\n initialData={clientData}\n namePlural=\"\"\n onCancel={() => setClientEditing(false)}\n onSubmit={async (data) => {\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const dbData: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(data)) {\n dbData[k.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase())] = v\n }\n await supabase.schema('saas_core').from('persons').update(dbData).eq('id', clientId)\n setClientData({ ...clientData, ...data })\n setClientEditing(false)\n } catch { /* toast */ }\n }}\n />\n ) : (\n <CrudDetailPage\n embedded\n entityDef={config.clientEntityDef}\n item={clientData}\n namePlural=\"\"\n basePath=\"\"\n onBack={() => setModalTab('appointment')}\n onEdit={() => setClientEditing(true)}\n />\n )\n ) : (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">{t('agenda.appointment.noClientData')}</p>\n )}\n </div>\n )}\n\n {/* Financial tab content */}\n {modalTab === 'financial' && editOrderId && config.financialBridge && (\n <div className=\"flex-1 overflow-y-auto\">\n <BookingPaymentPanel\n orderId={editOrderId}\n orderTotal={editOrderTotal}\n services={services.map((s: any) => ({ name: s.name, price: s.price, durationMinutes: s.durationMinutes }))}\n formatCurrency={(v) => fmtCurrency(v, currency.locale, currency.code)}\n inline\n onClose={() => setModalTab('appointment')}\n onPaymentChange={() => {\n config.financialBridge!.getPaymentDetail(editOrderId).then((d) => {\n if (d) { setEditPaymentStatus(d.status); setEditOrderTotal(d.totalAmount) }\n }).catch(() => {})\n // Propagate to the calendar card + popover badge (booking.paymentStatus\n // is ledger-derived) so they update without a page refresh.\n if (agendaDateRange.start) fetchBookings(agendaDateRange)\n }}\n />\n </div>\n )}\n\n {/* Appointment tab content */}\n <form onSubmit={handleSubmit} className=\"flex flex-col flex-1 min-h-0 overflow-hidden\" style={{ display: modalTab === 'appointment' ? undefined : 'none' }}>\n <div className=\"border-t fayz-glass-divider px-5 py-3 space-y-1 flex-1 overflow-y-auto\">\n\n {/* Loading skeleton */}\n {loading && (\n <div className=\"space-y-2 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 py-1.5\">\n <div className=\"h-4 w-4 rounded bg-muted animate-pulse shrink-0\" />\n <div className=\"h-8 flex-1 rounded-lg bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n )}\n\n {!loading && <>\n\n {/* Client */}\n {activeType.fields.client && (\n <div className=\"flex items-center gap-3 py-1\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {clientId && !quickCreate ? (\n <div className=\"flex items-center gap-2 rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <PersonLink personId={clientId} name={clientSearch} size=\"default\" className=\"flex-1 min-w-0\" />\n {clientPhone && <span className=\"text-[10px] text-muted-foreground shrink-0\">{clientPhone}</span>}\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => { setClientId(''); setClientSearch(''); setClientPhone('') }}\n className=\"p-0.5 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ) : !quickCreate ? (\n <SearchCombobox\n value={clientSearch}\n onChange={(v) => { setClientSearch(v); setClientId('') }}\n onSelect={selectClient}\n options={clientOptions}\n loading={clientSearching}\n placeholder={t('agenda.appointment.searchClient')}\n allowCreate\n createLabel={t('agenda.appointment.newClient')}\n onCreateNew={(name) => { setQuickCreate(true); setNewClientName(name); setNewClientPhone(''); setNewClientEmail('') }}\n minimal\n inlineLabel={t('agenda.appointment.addClient')}\n />\n ) : (\n <div className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] p-2.5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input type=\"text\" value={newClientName} onChange={(e) => setNewClientName(e.target.value)}\n placeholder={t('agenda.appointment.name')} className=\"flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-ring\" autoFocus />\n <button type=\"button\" onClick={() => setQuickCreate(false)}\n className=\"p-1 text-muted-foreground hover:text-foreground shrink-0\"><X className=\"h-3.5 w-3.5\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <input type=\"tel\" value={newClientPhone} onChange={(e) => setNewClientPhone(e.target.value)}\n placeholder={t('agenda.appointment.phone')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n <input type=\"email\" value={newClientEmail} onChange={(e) => setNewClientEmail(e.target.value)}\n placeholder={t('agenda.appointment.emailOptional')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n <button type=\"button\" disabled={creatingClient || !newClientName.trim()}\n onClick={async () => {\n setCreatingClient(true)\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const { getAgendaTenantId } = await import('../lib/tenant')\n const supabase = getSupabaseClientOptional() as any\n const tenantId = getAgendaTenantId()\n if (!supabase || !tenantId) throw new Error('Not initialized')\n\n // 1. Insert into saas_core.persons (archetype table)\n const { data: personRow, error: personError } = await supabase.schema('saas_core').from('persons').insert({\n tenant_id: tenantId, kind: config.clientKind, name: newClientName.trim(),\n phone: newClientPhone.trim() || null, email: newClientEmail.trim() || null,\n }).select('id, name').single()\n if (personError) throw personError\n\n // 2. Insert into public.clients (project extension table)\n const { error: clientError } = await supabase.from('clients').insert({\n person_id: personRow.id, tenant_id: tenantId,\n })\n if (clientError) {\n // Rollback person if extension insert fails\n await supabase.schema('saas_core').from('persons').delete().eq('id', personRow.id)\n throw clientError\n }\n\n setClientId(personRow.id); setClientSearch(personRow.name); setQuickCreate(false)\n } catch (err: any) {\n const { toast } = await import('@fayz-ai/ui')\n toast.error(t('agenda.appointment.createClientFailed'), { description: err?.message })\n }\n setCreatingClient(false)\n }}\n className=\"w-full rounded-md bg-primary border border-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">\n {creatingClient ? t('agenda.appointment.creating') : t('agenda.appointment.create')}\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Location */}\n {activeType.fields.location && config.modules.locationSelection && (storeLocations.length > 0 || config.locations.length > 0) && (\n <div className=\"flex items-center gap-3 py-1\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <LocationSelect\n value={locationId}\n onChange={setLocationId}\n locations={storeLocations.length > 0 ? storeLocations : config.locations}\n />\n </div>\n )}\n\n {/* Services */}\n {activeType.fields.services && (\n <div className=\"flex items-start gap-3 py-1\">\n <Briefcase className=\"h-4 w-4 mt-1.5 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {services.length > 0 && (\n <div className=\"space-y-0.5 mb-1\">\n {services.map((svc, idx) => (\n <div key={idx} className=\"flex items-center rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <span className=\"flex-1 truncate min-w-0\">{svc.name}</span>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <InlineNumber\n value={svc.durationMinutes}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, durationMinutes: Math.round(v) } : s))}\n min={5}\n step={5}\n className=\"w-10 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.duration')}\n />\n <span className=\"text-[11px] text-muted-foreground\">min</span>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <span className=\"text-[11px] text-muted-foreground\">{currency.symbol}</span>\n <InlineNumber\n value={svc.price}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, price: v } : s))}\n min={0}\n step={0.01}\n className=\"w-14 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.price')}\n />\n </div>\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => removeService(idx)} className=\"p-0.5 ml-2 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {!isPaidBooking && <SearchCombobox\n value={serviceSearch}\n onChange={setServiceSearch}\n onSelect={addService}\n options={serviceOptions}\n placeholder={t('agenda.appointment.searchService')}\n onBlurEmpty={() => {}}\n onFocus={() => { if (!serviceSearch && serviceOptions.length === 0) setServiceOptions(initialServiceOptions) }}\n renderRight={(opt) => {\n const dur = (opt.data?.duration_minutes as number) || 0\n const hasPrice = opt.price != null\n if (!hasPrice && !dur) return null\n return (\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">\n {hasPrice && fmtCurrency(opt.price!, currency.locale, currency.code)}\n {hasPrice && dur > 0 && ' · '}\n {dur > 0 && `${dur}min`}\n </span>\n )\n }}\n minimal\n inlineLabel={services.length > 0 ? t('agenda.appointment.addService') : t('agenda.appointment.addServiceFirst')}\n inlineIcon={services.length > 0 ? 'plus' : 'search'}\n />}\n </div>\n </div>\n )}\n\n {/* Status */}\n {activeType.fields.status && (\n <div className=\"flex items-center gap-3 py-1\">\n <CircleDot className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <StatusSelect value={status} onChange={setStatus} statuses={config.statuses} bookingDate={date} />\n </div>\n )}\n\n {/* Notes — progressive disclosure */}\n {!showNotes ? (\n <div className=\"flex items-center gap-3 py-1\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <button type=\"button\" onClick={() => setShowNotes(true)}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors text-left py-1.5 pl-2\">\n {t('agenda.appointment.addNotes')}\n </button>\n </div>\n ) : (\n <div className=\"flex items-start gap-3 py-1\">\n <FileText className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <textarea value={notes} onChange={(e) => setNotes(e.target.value)}\n placeholder={t('agenda.appointment.addDescription')} rows={2} autoFocus\n className=\"w-full flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n\n </>}\n </div>\n\n {/* Appointment footer — inside form for submit */}\n {modalTab === 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n {confirmingDelete ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setConfirmingDelete(false)}>\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"button\" variant=\"destructive\" size=\"sm\" onClick={handleDelete} disabled={deleting}>\n {deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {mode === 'edit' && (\n <button type=\"button\" onClick={() => setConfirmingDelete(true)} className=\"text-xs text-destructive font-medium hover:underline\">{t('agenda.appointment.delete')}</button>\n )}\n {services.length > 0 && (\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {totalDuration}min\n {config.modules.financial && totalPrice > 0 && mode === 'edit' ? (\n paymentStatusLoading ? (\n <span className=\"h-4 w-16 rounded-full bg-muted animate-pulse\" />\n ) : isPaidBooking ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success hover:bg-success/20 transition-colors\">\n <Check className=\"h-2.5 w-2.5\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} · {t('agenda.payment.paid')}\n </button>\n ) : date <= new Date().toISOString().slice(0, 10) ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning hover:bg-warning/20 transition-colors\">\n <HandCoins className=\"h-3 w-3\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} · {t('agenda.payment.collect')}\n </button>\n ) : (\n <span>· {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )\n ) : (\n <span>· {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose} className=\"hidden sm:inline-flex\">\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={!canSubmit || !isDirty}>\n {saving ? t('agenda.appointment.saving') : mode === 'create' ? t('agenda.appointment.save') : t('agenda.appointment.update')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </form>\n\n {/* Non-appointment tab footer — outside form */}\n {modalTab !== 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n <div className=\"flex items-center\">\n <button type=\"button\" onClick={() => { setModalTab('appointment'); setClientEditing(false) }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\">\n <svg className=\"h-3 w-3\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n {t('agenda.payment.backToAppointment')}\n </button>\n </div>\n </div>\n )}\n </div>\n </ModalContent>\n\n </Modal>\n )\n}\n","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\n// ---------------------------------------------------------------------------\n// Inject animations once\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-floating-panel'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const s = document.createElement('style')\n s.id = STYLE_ID\n s.textContent = `\n @keyframes _fp-dismiss { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(.96) } }\n @keyframes _fp-expand { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(1.08) } }\n .saas-fp-dismissing { animation: _fp-dismiss 150ms ease-in forwards; pointer-events: none }\n .saas-fp-expanding { animation: _fp-expand 200ms ease-in forwards; pointer-events: none }\n `\n document.head.appendChild(s)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Phase = 'visible' | 'dismissing' | 'expanding'\n\nexport interface FloatingPanelRef {\n /** Dismiss with fade-out, then call onClose */\n dismiss: () => void\n /** Expand-out animation (e.g. popover → modal), then call callback */\n expandThen: (callback: () => void) => void\n}\n\ninterface FloatingPanelProps {\n position: { x: number; y: number }\n width: number\n height: number\n /** Offset from cursor (default: { x: 0, y: 0 }) */\n offset?: { x: number; y: number }\n onClose: () => void\n className?: string\n children: (ref: FloatingPanelRef) => React.ReactNode\n zIndex?: number\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function FloatingPanel({\n position, width, height, offset, onClose, className, children, zIndex = 100,\n}: FloatingPanelProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [phase, setPhase] = useState<Phase>('visible')\n const phaseRef = useRef<Phase>('visible')\n phaseRef.current = phase\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n const expandCallbackRef = useRef<(() => void) | null>(null)\n\n const dismiss = useCallback(() => {\n if (phaseRef.current !== 'visible') return\n setPhase('dismissing')\n setTimeout(() => onCloseRef.current(), 150)\n }, [])\n\n const expandThen = useCallback((callback: () => void) => {\n if (phaseRef.current !== 'visible') return\n expandCallbackRef.current = callback\n setPhase('expanding')\n setTimeout(() => {\n callback()\n onCloseRef.current()\n }, 220)\n }, [])\n\n // Outside click + Escape\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (phaseRef.current !== 'visible') return\n if (ref.current && !ref.current.contains(e.target as Node)) {\n // Don't dismiss if clicking another calendar event — let eventClick handle it\n const target = e.target as HTMLElement\n if (target.closest('.fc-event')) return\n dismiss()\n }\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') dismiss()\n }\n document.addEventListener('mousedown', handleClick)\n document.addEventListener('keydown', handleKey)\n return () => {\n document.removeEventListener('mousedown', handleClick)\n document.removeEventListener('keydown', handleKey)\n }\n }, [dismiss])\n\n // Clamp position to viewport\n const ox = offset?.x ?? 0\n const oy = offset?.y ?? 0\n let x = position.x + ox\n let y = position.y + oy\n if (x + width > window.innerWidth - 12) x = x - width - ox * 2\n if (y + height > window.innerHeight - 12) y = y - height - oy * 2\n if (x < 12) x = 12\n if (y < 12) y = 12\n\n const panelRef: FloatingPanelRef = { dismiss, expandThen }\n\n return createPortal(\n <div ref={ref}\n style={{ position: 'fixed', left: x, top: y, zIndex, transition: phase === 'visible' ? 'left 200ms ease-out, top 200ms ease-out' : undefined }}\n className={`fayz-glass-surface rounded-modal border bg-popover shadow-lg overflow-hidden ${\n phase === 'expanding' ? 'saas-fp-expanding'\n : phase === 'dismissing' ? 'saas-fp-dismissing'\n : 'animate-in fade-in zoom-in-95 duration-150'\n } ${className ?? ''}`}>\n {children(panelRef)}\n </div>,\n document.body,\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { X, Pencil, Trash2, Clock, MapPin, User, FileText, DollarSign, Check, AlertTriangle, HandCoins } from 'lucide-react'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { FloatingPanel, type FloatingPanelRef } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nfunction fmtTime(iso: string) {\n return new Date(iso).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n}\nfunction fmtDate(iso: string) {\n return new Date(iso).toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' })\n}\nfunction fmtCurrency(amount: number, locale: string, code: string) {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\n// Inline status select for the popover\nfunction PopoverStatusSelect({ value, statuses, bookingStartsAt, onChange }: {\n value: string; statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingStartsAt: string; onChange: (v: string) => void\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative inline-block\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors hover:opacity-80\"\n style={{ backgroundColor: (current?.color ?? '#6b7280') + '18', color: current?.color ?? '#6b7280' }}>\n <span className=\"h-2 w-2 rounded-full\" style={{ backgroundColor: current?.color }} />\n {current?.label ?? value}\n <svg className=\"h-3 w-3 opacity-50\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute bottom-full left-0 z-50 mb-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 min-w-[140px]\">\n {statuses.map((s) => {\n const available = isStatusAvailable(s as any, bookingStartsAt)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-xs transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nexport function AppointmentPopover({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const openModal = useAgendaStore((s) => s.openAppointmentModal)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const statusConfig = config.statuses.find((s) => s.value === booking.status)\n const color = statusConfig?.color ?? '#6b7280'\n const timeRange = `${fmtTime(booking.startsAt)}${booking.endsAt ? ' – ' + fmtTime(booking.endsAt) : ''}`\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <>\n <FloatingPanel position={position} width={320} height={340} onClose={onClose}>\n {(panel) => (\n <>\n {/* Action bar */}\n <div className=\"flex items-center justify-end gap-0.5 px-3 pt-3 pb-1\">\n {confirmingDelete ? (\n <>\n <span className=\"text-xs text-destructive font-medium mr-auto pl-1\">{t('agenda.appointment.deleteConfirm')}</span>\n <button onClick={() => setConfirmingDelete(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </>\n ) : (\n <>\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"p-1.5 rounded-full hover:bg-muted transition-colors\" title={t('common.edit')}>\n <Pencil className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n <button onClick={() => setConfirmingDelete(true)}\n className=\"p-1.5 rounded-full hover:bg-destructive/10 transition-colors\" title={t('common.delete')}>\n <Trash2 className=\"h-4 w-4 text-muted-foreground hover:text-destructive\" />\n </button>\n <button onClick={panel.dismiss} className=\"p-1.5 rounded-full hover:bg-muted transition-colors\">\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </>\n )}\n </div>\n\n {/* Content */}\n <div className=\"px-5 pb-5 space-y-3\">\n <div className=\"flex items-start gap-3\">\n <span className=\"mt-1.5 h-3 w-3 rounded shrink-0\" style={{ backgroundColor: color }} />\n <div className=\"min-w-0\">\n <PersonLink personId={booking.clientId} name={booking.clientName ?? 'Unknown'} className=\"text-base\" />\n <p className=\"text-sm text-muted-foreground mt-0.5\">{fmtDate(booking.startsAt)} · {timeRange}</p>\n </div>\n </div>\n\n {booking.services && booking.services.length > 0 && (\n <div className=\"flex items-start gap-3\">\n <Clock className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <div className=\"text-sm space-y-0.5\">\n {booking.services.map((svc) => (\n <p key={svc.id}>{svc.name} <span className=\"text-muted-foreground\">({svc.durationMinutes}min)</span></p>\n ))}\n </div>\n </div>\n )}\n\n {booking.professionalName && (\n <div className=\"flex items-center gap-3\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.professionalName}</span>\n </div>\n )}\n\n {booking.locationName && (\n <div className=\"flex items-center gap-3\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.locationName}</span>\n </div>\n )}\n\n {booking.notes && (\n <div className=\"flex items-start gap-3\">\n <FileText className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <p className=\"text-sm text-muted-foreground\">{booking.notes}</p>\n </div>\n )}\n\n {booking.orderTotal != null && booking.orderTotal > 0 && (() => {\n const total = fmtCurrency(booking.orderTotal, config.currency.locale, config.currency.code)\n const ps = booking.paymentStatus ?? 'none'\n const hasFinancial = config.modules.financial && booking.orderId\n\n // No financial module — just show total\n if (!hasFinancial) {\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <span className=\"font-medium\">{total}</span>\n </div>\n )\n }\n\n const badgeConfig: Record<string, { icon: React.ElementType; bg: string; text: string; label: string }> = {\n none: { icon: HandCoins, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.collect')}` },\n pending: { icon: Clock, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.pending')}` },\n partial: { icon: DollarSign, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.partial')}` },\n paid: { icon: Check, bg: 'bg-success/10 hover:bg-success/15', text: 'text-success', label: `${total} · ${t('agenda.payment.paid')}` },\n overdue: { icon: AlertTriangle, bg: 'bg-destructive/10 hover:bg-destructive/15', text: 'text-destructive', label: `${total} · ${t('agenda.payment.overdue')}` },\n cancelled: { icon: X, bg: 'bg-muted hover:bg-muted/80', text: 'text-muted-foreground', label: `${total} · ${t('agenda.payment.cancelled')}` },\n }\n const cfg = badgeConfig[ps] ?? badgeConfig.none\n const StatusIcon = cfg.icon\n\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <button\n type=\"button\"\n onClick={() => { onClose(); openModal('edit', { bookingId: booking.id, initialTab: 'financial' }) }}\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium transition-colors ${cfg.bg} ${cfg.text}`}\n >\n <StatusIcon className=\"h-3 w-3\" />\n {cfg.label}\n </button>\n </div>\n )\n })()}\n\n <div className=\"pt-2 border-t fayz-glass-divider\">\n <PopoverStatusSelect\n value={booking.status}\n statuses={config.statuses}\n bookingStartsAt={booking.startsAt}\n onChange={(v) => { updateStatus(booking.id, v); onClose() }}\n />\n </div>\n </div>\n </>\n )}\n </FloatingPanel>\n </>\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Pencil, Trash2, Check } from 'lucide-react'\nimport { FloatingPanel } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// Tooltip — portaled to body\n// ---------------------------------------------------------------------------\n\nfunction Tooltip({ anchor, label }: { anchor: DOMRect; label: string }) {\n return createPortal(\n <div style={{ position: 'fixed', left: anchor.left + anchor.width / 2, top: anchor.bottom + 6, transform: 'translateX(-50%)', zIndex: 120 }}\n className=\"pointer-events-none\">\n <div className=\"rounded-md bg-foreground text-background px-2 py-0.5 text-[11px] font-medium whitespace-nowrap shadow-lg\">\n {label}\n </div>\n </div>,\n document.body,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Status dot with portaled tooltip\n// ---------------------------------------------------------------------------\n\nfunction StatusDot({ color, label, isActive, disabled, onClick }: {\n color: string; label: string; isActive: boolean; disabled?: boolean; onClick: () => void\n}) {\n const [hover, setHover] = useState(false)\n const btnRef = useRef<HTMLButtonElement>(null)\n const [rect, setRect] = useState<DOMRect | null>(null)\n\n return (\n <>\n <button ref={btnRef} type=\"button\" onClick={disabled ? undefined : onClick} disabled={disabled}\n onMouseEnter={() => { setHover(true); if (btnRef.current) setRect(btnRef.current.getBoundingClientRect()) }}\n onMouseLeave={() => setHover(false)}\n className={`flex h-7 w-7 items-center justify-center rounded-full transition-all ${\n disabled ? 'opacity-25 cursor-not-allowed' : isActive ? 'ring-2 ring-offset-2 ring-offset-popover' : 'hover:scale-110'\n }`}\n style={{ backgroundColor: color, ['--tw-ring-color' as any]: isActive ? color : undefined }}>\n {isActive && <Check className=\"h-3.5 w-3.5 text-white\" strokeWidth={2.5} />}\n </button>\n {hover && rect && <Tooltip anchor={rect} label={label} />}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Context Menu\n// ---------------------------------------------------------------------------\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nexport function EventContextMenu({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const [confirming, setConfirming] = useState(false)\n const [deleting, setDeleting] = useState(false)\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <FloatingPanel position={position} width={230} height={180} offset={{ x: 4, y: 4 }} onClose={onClose} zIndex={110}>\n {(panel) => (\n <>\n <div className=\"py-1\">\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors\">\n <Pencil className=\"h-4 w-4 text-muted-foreground\" /> {t('agenda.contextMenu.edit')}\n </button>\n {confirming ? (\n <div className=\"flex items-center justify-between px-4 py-2\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-1.5\">\n <button onClick={() => setConfirming(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setConfirming(true)}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors text-destructive\">\n <Trash2 className=\"h-4 w-4\" /> {t('agenda.contextMenu.delete')}\n </button>\n )}\n </div>\n\n <div className=\"border-t px-4 py-3\">\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.contextMenu.changeStatus')}</p>\n <div className=\"flex items-center gap-1.5\">\n {config.statuses.map((s) => {\n const available = isStatusAvailable(s, booking.startsAt)\n return (\n <StatusDot key={s.value} color={s.color} label={available ? s.label : `${s.label} ${t('agenda.contextMenu.notAvailable')}`}\n isActive={booking.status === s.value}\n disabled={!available}\n onClick={() => { if (available) { updateStatus(booking.id, s.value); panel.dismiss() } }} />\n )\n })}\n </div>\n </div>\n </>\n )}\n </FloatingPanel>\n )\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react'\nimport { injectCalendarStyles } from '../calendar-styles'\nimport FullCalendar from '@fullcalendar/react'\nimport dayGridPlugin from '@fullcalendar/daygrid'\nimport timeGridPlugin from '@fullcalendar/timegrid'\nimport resourceTimeGridPlugin from '@fullcalendar/resource-timegrid'\nimport interactionPlugin from '@fullcalendar/interaction'\nimport listPlugin from '@fullcalendar/list'\nimport ptBrLocale from '@fullcalendar/core/locales/pt-br'\nimport type { EventInput, EventClickArg, DateSelectArg, EventDropArg } from '@fullcalendar/core'\nimport { ChevronLeft, ChevronRight, Plus, ChevronDown, Settings } from 'lucide-react'\nimport { usePluginPrefs } from '@fayz-ai/saas'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\nimport { MiniCalendar } from '../components/MiniCalendar'\nimport { AppointmentModal } from '../components/AppointmentModal'\nimport { AppointmentPopover } from '../components/AppointmentPopover'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { EventContextMenu } from '../components/EventContextMenu'\nimport { ConfirmDialog } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport type { CalendarBooking, Schedule } from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction bookingToEvent(booking: CalendarBooking, statusColors: Record<string, string>): EventInput {\n const color = statusColors[booking.status] ?? '#6b7280'\n const serviceNames = booking.services?.map((s) => s.name).join(', ') ?? ''\n return {\n id: booking.id,\n resourceId: booking.professionalId ?? undefined,\n title: booking.clientName ?? 'Unknown',\n start: booking.startsAt,\n end: booking.endsAt ?? undefined,\n backgroundColor: color + '30',\n borderColor: color,\n textColor: color,\n extendedProps: { booking, serviceNames },\n }\n}\n\n/**\n * Generate FullCalendar background events showing unavailable time.\n * For each day, creates background blocks for the gaps OUTSIDE working hours\n * within the visible business hours window. This grays out non-working time.\n */\nfunction generateAvailabilityEvents(\n schedules: Schedule[],\n professionals: { id: string }[],\n dateRange: { start: string; end: string } | null,\n businessHours?: { startTime: string; endTime: string },\n locationMap?: Map<string, string>,\n): EventInput[] {\n if (!dateRange || schedules.length === 0) return []\n\n const bgEvents: EventInput[] = []\n const startDate = new Date(dateRange.start)\n const endDate = new Date(dateRange.end)\n const bizStart = businessHours?.startTime ?? '08:00'\n const bizEnd = businessHours?.endTime ?? '20:00'\n\n // Group schedules by assignee\n const byAssignee = new Map<string, Schedule[]>()\n for (const s of schedules) {\n const aid = s.assigneeId\n if (!aid) continue\n const list = byAssignee.get(aid) ?? []\n list.push(s)\n byAssignee.set(aid, list)\n }\n\n function timeToMinutes(t: string): number {\n const [h, m] = t.split(':').map(Number)\n return h * 60 + m\n }\n\n function minutesToTime(m: number): string {\n return `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}`\n }\n\n const bizStartMin = timeToMinutes(bizStart)\n const bizEndMin = timeToMinutes(bizEnd)\n\n for (const prof of professionals) {\n const profSchedules = byAssignee.get(prof.id) ?? []\n\n // Separate weekly and date-specific schedules\n const weekly = profSchedules.filter((s) => s.dayOfWeek != null && !s.specificDate)\n const exceptions = profSchedules.filter((s) => s.specificDate != null)\n const exceptionDates = new Set(exceptions.map((s) => s.specificDate!))\n\n const current = new Date(startDate)\n while (current < endDate) {\n const dateStr = current.toISOString().slice(0, 10)\n const dayOfWeek = current.getDay()\n\n // Get working periods for this day\n let daySchedules: Schedule[]\n if (exceptionDates.has(dateStr)) {\n daySchedules = exceptions.filter((s) => s.specificDate === dateStr && s.isActive)\n } else {\n daySchedules = weekly.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive)\n }\n\n // Convert working periods to sorted minute ranges, preserving locationId\n const workRanges = daySchedules\n .map((s) => {\n const locId = s.locationId ?? (s.metadata?.locationId as string | undefined)\n return {\n start: timeToMinutes(s.startsAt),\n end: timeToMinutes(s.endsAt),\n locationName: locId && locationMap ? locationMap.get(locId) : undefined,\n }\n })\n .sort((a, b) => a.start - b.start)\n\n // Compute unavailable gaps within business hours\n let cursor = bizStartMin\n for (const range of workRanges) {\n const availStart = Math.max(range.start, bizStartMin)\n const availEnd = Math.min(range.end, bizEndMin)\n\n // Gap before this working range = unavailable\n if (cursor < availStart) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n // Location label on available range\n if (availStart < availEnd && range.locationName) {\n bgEvents.push({\n id: `loc-${prof.id}-${dateStr}-${minutesToTime(availStart)}`,\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(availStart) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart + 20) + ':00',\n title: range.locationName,\n display: 'auto',\n editable: false,\n backgroundColor: 'transparent',\n borderColor: 'transparent',\n textColor: '#a3a3a3',\n classNames: ['fc-location-label'],\n extendedProps: { isLocationLabel: true },\n })\n }\n\n cursor = Math.max(cursor, availEnd)\n }\n\n // Gap after last working range = unavailable\n if (cursor < bizEndMin) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(bizEndMin) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n\n current.setDate(current.getDate() + 1)\n }\n }\n\n return bgEvents\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton — mimics the resource-timegrid-week layout\n// ---------------------------------------------------------------------------\n\nfunction CalendarSkeleton({ profCount = 2 }: { profCount?: number }) {\n const days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']\n const hours = ['07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00']\n\n return (\n <div className=\"flex-1 overflow-hidden animate-pulse\">\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 border-r last:border-r-0 py-2 px-3\">\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded-full bg-muted\" />\n <div className=\"h-3 w-20 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 flex border-r last:border-r-0\">\n {days.map((d) => (\n <div key={d} className=\"flex-1 py-1.5 text-center\">\n <span className=\"text-[10px] text-muted-foreground/40\">{d}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n <div className=\"relative\">\n {hours.map((h) => (\n <div key={h} className=\"flex border-b border-border/30\" style={{ height: 50 }}>\n <div className=\"w-14 shrink-0 pr-2 text-right\">\n <span className=\"text-[10px] text-muted-foreground/30\">{h}</span>\n </div>\n <div className=\"flex-1 flex\">\n {Array.from({ length: profCount * 7 }).map((_, ci) => (\n <div key={ci} className={`flex-1 border-r border-border/20 ${Math.floor(ci / 7) % 2 === 1 ? 'bg-muted/20' : ''}`} />\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nconst VIEW_OPTIONS = [\n { key: 'resourceTimeGridDay', labelKey: 'agenda.calendar.viewDay' },\n { key: 'resourceTimeGridWeek', labelKey: 'agenda.calendar.viewWeek' },\n { key: 'dayGridMonth', labelKey: 'agenda.calendar.viewMonth' },\n] as const\n\n// ---------------------------------------------------------------------------\n// Calendar View\n// ---------------------------------------------------------------------------\n\nexport function CalendarView() {\n injectCalendarStyles()\n const config = useAgendaConfig()\n const t = useTranslation()\n const currentLocale = getCurrentLocale()\n const fcLocale = currentLocale === 'pt-BR' ? ptBrLocale : undefined\n const calendarRef = useRef<FullCalendar>(null)\n const prefs = usePluginPrefs('agenda', { calendarView: config.defaultCalendarView ?? 'resourceTimeGridWeek' })\n const agendaSettings = useAgendaSettings()\n const effectiveBusinessHours = {\n startTime: agendaSettings.startTime,\n endTime: agendaSettings.endTime,\n }\n\n const bookings = useAgendaStore((s) => s.bookings)\n const bookingsLoading = useAgendaStore((s) => s.bookingsLoading)\n const professionals = useAgendaStore((s) => s.professionals)\n const professionalsLoading = useAgendaStore((s) => s.professionalsLoading)\n const currentView = useAgendaStore((s) => s.currentView)\n const selectedProfIds = useAgendaStore((s) => s.selectedProfessionalIds)\n const selectedStatuses = useAgendaStore((s) => s.selectedStatuses)\n const schedules = useAgendaStore((s) => s.schedules)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const fetchProfessionals = useAgendaStore((s) => s.fetchProfessionals)\n const fetchLocations = useAgendaStore((s) => s.fetchLocations)\n const storeLocations = useAgendaStore((s) => s.locations)\n const fetchSchedules = useAgendaStore((s) => s.fetchSchedules)\n const rescheduleBooking = useAgendaStore((s) => s.rescheduleBooking)\n const setView = useAgendaStore((s) => s.setView)\n const setFilters = useAgendaStore((s) => s.setFilters)\n const _openModal = useAgendaStore((s) => s.openAppointmentModal)\n const closeModal = useAgendaStore((s) => s.closeAppointmentModal)\n const modalState = useAgendaStore((s) => s.appointmentModal)\n\n const [selectedBooking, setSelectedBooking] = useState<CalendarBooking | null>(null)\n const [popoverAnchor, setPopoverAnchor] = useState<{ x: number; y: number } | null>(null)\n const [popoverVisible, _setPopoverVisible] = useState(false)\n const popoverVisibleRef = useRef(false)\n const setPopoverVisible = useCallback((v: boolean) => { popoverVisibleRef.current = v; _setPopoverVisible(v) }, [])\n const [contextMenu, setContextMenu] = useState<{ booking: CalendarBooking; x: number; y: number } | null>(null)\n const [contextMenuVisible, _setContextMenuVisible] = useState(false)\n const contextMenuVisibleRef = useRef(false)\n const setContextMenuVisible = useCallback((v: boolean) => { contextMenuVisibleRef.current = v; _setContextMenuVisible(v) }, [])\n const [scheduleConfirm, setScheduleConfirm] = useState<{ onConfirm: () => void } | null>(null)\n const [calendarTitle, setCalendarTitle] = useState('')\n const [selectedDate, setSelectedDate] = useState(new Date())\n const [profSectionOpen, setProfSectionOpen] = useState(true)\n const [statusSectionOpen, setStatusSectionOpen] = useState(false)\n const [visibleRange, setVisibleRange] = useState<{ start: string; end: string } | null>(null)\n\n // Wrap openModal to always dismiss popover/context menu first\n const openModal: typeof _openModal = useCallback((...args) => {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n _openModal(...args)\n }, [_openModal])\n\n const statusColors = useMemo(() => {\n const map: Record<string, string> = {}\n for (const s of config.statuses) map[s.value] = s.color\n return map\n }, [config.statuses])\n\n useEffect(() => {\n fetchProfessionals(); fetchSchedules()\n if (config.modules.locationSelection) fetchLocations()\n }, [])\n\n const resources = useMemo(() => {\n const filtered = selectedProfIds.length > 0\n ? professionals.filter((p) => selectedProfIds.includes(p.id))\n : professionals\n return filtered.map((p) => ({\n id: p.id, title: p.name,\n extendedProps: { avatarUrl: p.avatarUrl, locationName: p.locationName },\n }))\n }, [professionals, selectedProfIds])\n\n const bookingEvents = useMemo(() =>\n bookings.map((b) => bookingToEvent(b, statusColors)), [bookings, statusColors])\n\n // Merge static config locations with dynamically fetched locations\n const allLocations = useMemo(() => {\n const map = new Map<string, string>()\n for (const loc of config.locations) map.set(loc.id, loc.name)\n for (const loc of storeLocations) map.set(loc.id, loc.name)\n return map\n }, [config.locations, storeLocations])\n\n const locationMap = useMemo(() => {\n if (!config.modules.locationSelection || allLocations.size === 0) return undefined\n return allLocations\n }, [config.modules.locationSelection, allLocations])\n\n const availabilityEvents = useMemo(() =>\n generateAvailabilityEvents(schedules, professionals, visibleRange, effectiveBusinessHours, locationMap),\n [schedules, professionals, visibleRange, effectiveBusinessHours, locationMap])\n\n const events = useMemo(() =>\n [...bookingEvents, ...availabilityEvents], [bookingEvents, availabilityEvents])\n\n // ── Calendar handlers ──\n const handleDatesSet = useCallback((arg: { startStr: string; endStr: string; view: { title: string; type: string } }) => {\n setCalendarTitle(arg.view.title)\n setView(arg.view.type)\n setVisibleRange({ start: arg.startStr, end: arg.endStr })\n fetchBookings({ start: arg.startStr, end: arg.endStr })\n }, [fetchBookings, setView])\n\n // Double-click → open edit directly\n // Right-click → context menu\n const handleEventDidMount = useCallback((arg: { event: any; el: HTMLElement }) => {\n const booking = arg.event.extendedProps?.booking as CalendarBooking | undefined\n if (booking) arg.el.setAttribute('data-booking-id', booking.id)\n arg.el.addEventListener('dblclick', (e) => {\n e.preventDefault()\n e.stopPropagation()\n skipClickRef.current = true\n const booking = arg.event.extendedProps.booking as CalendarBooking\n setSelectedBooking(null)\n setPopoverAnchor(null)\n setContextMenu(null)\n openModal('edit', { bookingId: booking.id })\n })\n arg.el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n const booking = arg.event.extendedProps.booking as CalendarBooking\n const menuW = 210, menuH = 200\n let x = e.clientX + 4\n let y = e.clientY + 4\n if (x + menuW > window.innerWidth - 12) x = x - menuW\n if (y + menuH > window.innerHeight - 12) y = y - menuH\n setContextMenu({ booking, x, y })\n setContextMenuVisible(true)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n })\n }, [])\n\n // Flag to suppress single-click after a double-click\n const skipClickRef = useRef(false)\n\n // Hover timer — show popover after 4s hover on a booking event\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleEventMouseEnter = useCallback((arg: { event: any; el: HTMLElement }) => {\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n\n hoverTimerRef.current = setTimeout(() => {\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, 3000)\n }, [])\n\n const handleEventMouseLeave = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current)\n hoverTimerRef.current = null\n }\n }, [])\n\n // Single click — open popover instantly, or slide to new position if already open\n const handleEventClick = useCallback((arg: EventClickArg) => {\n if (skipClickRef.current) { skipClickRef.current = false; return }\n // Ignore clicks on background availability events and location labels\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n setContextMenu(null); setContextMenuVisible(false)\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n // Always update — if popover is already open it slides to the new position\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, [])\n\n // Find the schedule block covering a given time slot for a professional\n const findScheduleForSlot = useCallback((professionalId: string | undefined, dateTimeStr: string): Schedule | null => {\n if (!professionalId) return null\n const dt = new Date(dateTimeStr)\n const dateStr = dt.toISOString().slice(0, 10)\n const dayOfWeek = dt.getDay()\n const timeMin = dt.getHours() * 60 + dt.getMinutes()\n\n const profSchedules = schedules.filter((s) => s.assigneeId === professionalId)\n const exceptions = profSchedules.filter((s) => s.specificDate === dateStr && s.isActive)\n const weekly = profSchedules.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive && !s.specificDate)\n const daySchedules = exceptions.length > 0 ? exceptions : weekly\n\n for (const s of daySchedules) {\n const [sh, sm] = s.startsAt.split(':').map(Number)\n const [eh, em] = s.endsAt.split(':').map(Number)\n if (timeMin >= sh * 60 + sm && timeMin < eh * 60 + em) return s\n }\n return null\n }, [schedules])\n\n const handleSelect = useCallback((arg: DateSelectArg) => {\n calendarRef.current?.getApi().unselect()\n\n // Don't open create if popover/context menu is showing — dismiss them instead\n if (popoverVisibleRef.current || contextMenuVisibleRef.current) {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n return\n }\n\n const professionalId = arg.resource?.id\n const schedule = findScheduleForSlot(professionalId, arg.startStr)\n\n const proceed = () => {\n const locId = schedule?.locationId ?? (schedule?.metadata?.locationId as string | undefined)\n openModal('create', { prefill: { startsAt: arg.startStr, endsAt: arg.endStr, professionalId, locationId: locId || undefined } })\n }\n\n // Warn if no schedule covers this slot\n if (!schedule) {\n setScheduleConfirm({ onConfirm: proceed })\n return\n }\n\n proceed()\n }, [openModal, findScheduleForSlot])\n\n const handleEventDrop = useCallback(async (arg: EventDropArg) => {\n const booking = arg.event.extendedProps.booking as CalendarBooking\n try { await rescheduleBooking(booking.id, arg.event.startStr, arg.event.endStr, arg.newResource?.id ?? undefined) }\n catch { arg.revert() }\n }, [rescheduleBooking])\n\n const handleViewChange = useCallback((v: string) => {\n calendarRef.current?.getApi().changeView(v)\n prefs.set('calendarView', v)\n }, [prefs])\n const handlePrev = useCallback(() => calendarRef.current?.getApi().prev(), [])\n const handleNext = useCallback(() => calendarRef.current?.getApi().next(), [])\n const handleToday = useCallback(() => { calendarRef.current?.getApi().today(); setSelectedDate(new Date()) }, [])\n\n function handleMiniDateSelect(date: Date) {\n setSelectedDate(date)\n calendarRef.current?.getApi().gotoDate(date)\n }\n\n function toggleProfessional(id: string) {\n const next = selectedProfIds.includes(id)\n ? selectedProfIds.filter((p) => p !== id)\n : [...selectedProfIds, id]\n setFilters({ professionalIds: next })\n }\n\n function toggleStatus(value: string) {\n const next = selectedStatuses.includes(value)\n ? selectedStatuses.filter((s) => s !== value)\n : [...selectedStatuses, value]\n setFilters({ statuses: next })\n }\n\n // Alternating resource backgrounds — apply via DOM after render\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // Responsive day headers — collapse weekday names to a single initial (S M T\n // W T F S, Google-Calendar style) when day columns get too narrow. Measured\n // from the actual rendered column width so it adapts to resource count + view.\n const [dayHeaderCompact, setDayHeaderCompact] = useState(false)\n useEffect(() => {\n const container = wrapperRef.current\n if (!container) return\n let frame = 0\n const measure = () => {\n // Measure an actual DAY column ([data-date]) — in resource views the first\n // .fc-col-header-cell is the wide resource header, not a day column.\n const cell = container.querySelector('.fc-col-header-cell[data-date]') as HTMLElement | null\n if (!cell) return\n const colWidth = cell.getBoundingClientRect().width\n // Collapse to single-letter ONLY when the full weekday label can't fit.\n // Measure the widest full line (\"WED\" / \"12/14\") in the header's font so\n // the breakpoint adapts to font + locale instead of a magic number.\n const cushion = (cell.querySelector('.fc-col-header-cell-cushion') as HTMLElement | null) ?? cell\n const cs = getComputedStyle(cushion)\n const probe = document.createElement('span')\n probe.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;top:-9999px'\n probe.style.fontSize = cs.fontSize\n probe.style.fontWeight = cs.fontWeight\n probe.style.fontFamily = cs.fontFamily\n probe.style.letterSpacing = cs.letterSpacing\n probe.style.textTransform = cs.textTransform\n document.body.appendChild(probe)\n probe.textContent = 'Wed'\n const weekdayWidth = probe.getBoundingClientRect().width\n probe.textContent = '12/14'\n const dateWidth = probe.getBoundingClientRect().width\n probe.remove()\n const needed = Math.max(weekdayWidth, dateWidth) + 12 // text + cushion padding\n setDayHeaderCompact(colWidth < needed)\n }\n // FullCalendar reflows its inner day columns on a later tick than the\n // container resize, so re-measure across a few frames to read settled widths.\n const timers: ReturnType<typeof setTimeout>[] = []\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(measure)\n timers.forEach(clearTimeout)\n timers.length = 0\n timers.push(setTimeout(measure, 130), setTimeout(measure, 330))\n }\n schedule()\n const ro = new ResizeObserver(schedule)\n ro.observe(container)\n return () => { cancelAnimationFrame(frame); timers.forEach(clearTimeout); ro.disconnect() }\n }, [resources, currentView, visibleRange])\n\n const applyResourceStriping = useCallback(() => {\n const container = wrapperRef.current\n if (!container) return\n const resourceIds = resources.map((r: { id: string }) => r.id)\n if (resourceIds.length < 2) return\n container.querySelectorAll('[data-resource-id]').forEach((el: Element) => {\n const rid = el.getAttribute('data-resource-id')\n const idx = rid ? resourceIds.indexOf(rid) : -1\n el.classList.toggle('fc-resource-alt', idx % 2 === 1)\n })\n }, [resources])\n\n useEffect(() => {\n applyResourceStriping()\n const t1 = setTimeout(applyResourceStriping, 100)\n const t2 = setTimeout(applyResourceStriping, 300)\n return () => { clearTimeout(t1); clearTimeout(t2) }\n }, [applyResourceStriping, currentView, visibleRange, bookings])\n\n // Listen for cross-plugin booking open requests (e.g., from financial invoice detail)\n useEffect(() => {\n function handleOpenBooking(e: Event) {\n const bookingId = (e as CustomEvent).detail?.bookingId\n if (bookingId) openModal('edit', { bookingId })\n }\n window.addEventListener('agenda:open-booking', handleOpenBooking)\n return () => window.removeEventListener('agenda:open-booking', handleOpenBooking)\n }, [openModal])\n\n // Custom day header: weekday + date stacked. When columns get narrow it\n // collapses the weekday to a single initial (S / 16, Google-Calendar style).\n // Always returns explicit content — returning undefined renders an EMPTY\n // header in the React adapter rather than falling back to the default.\n const dayHeaderContent = useCallback((arg: any) => {\n const date: Date = arg.date\n const dateLocale = currentLocale === 'pt-BR' ? 'pt-BR' : 'en'\n // Inline styles (not CSS classes) so stacking is guaranteed regardless of\n // the runtime style-injection state.\n const wrapStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', alignItems: 'center', lineHeight: 1.15 }\n const dateStyle: React.CSSProperties = { fontSize: '0.65rem', opacity: 0.75 }\n if (dayHeaderCompact) {\n const letter = date.toLocaleDateString(dateLocale, { weekday: 'narrow' })\n return (\n <div style={wrapStyle}>\n <span style={{ fontWeight: 600 }}>{letter}</span>\n <span style={dateStyle}>{date.getDate()}</span>\n </div>\n )\n }\n const weekday = date.toLocaleDateString(dateLocale, { weekday: 'short' })\n return (\n <div style={wrapStyle}>\n <span>{weekday}</span>\n <span style={dateStyle}>{`${date.getMonth() + 1}/${date.getDate()}`}</span>\n </div>\n )\n }, [dayHeaderCompact, currentLocale])\n\n const resourceLabelContent = useCallback((arg: any) => {\n const { id, title, extendedProps } = arg.resource\n const initials = title.split(' ').map((n: string) => n[0]).join('').slice(0, 2)\n return (\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-bold text-primary\">{initials}</div>\n <div className=\"min-w-0\">\n <PersonLink\n personId={id}\n name={title}\n size=\"sm\"\n tab=\"schedule\"\n profileHref={`#/registry/staff/${id}/schedule`}\n />\n {extendedProps?.locationName && <p className=\"text-[10px] text-muted-foreground truncate\">{extendedProps.locationName}</p>}\n </div>\n </div>\n )\n }, [])\n\n const eventContent = useCallback((arg: any) => {\n // Location label events — render as a small tag\n if (arg.event.extendedProps?.isLocationLabel) {\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden\">\n <p className=\"text-[10px] font-medium truncate\">{arg.event.title}</p>\n </div>\n )\n }\n const serviceNames = arg.event.extendedProps?.serviceNames\n const start = arg.event.start\n const end = arg.event.end\n const fmt = (d: Date) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n const timeRange = start && end ? `${fmt(start)} – ${fmt(end)}` : start ? fmt(start) : ''\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden leading-tight h-full\">\n <div className=\"flex items-start justify-between gap-1\">\n <p className=\"text-[11px] font-semibold truncate\">{arg.event.title}</p>\n {serviceNames && <p className=\"text-[10px] opacity-60 truncate shrink-0 max-w-[45%] text-right\">{serviceNames}</p>}\n </div>\n {timeRange && <p className=\"text-[9px] opacity-50\">{timeRange}</p>}\n </div>\n )\n }, [])\n\n return (\n <div className=\"flex h-[calc(100vh-7.5rem)]\">\n {/* ═══ LEFT SIDEBAR — hidden on mobile ═══ */}\n <div className=\"hidden md:flex w-[220px] shrink-0 flex-col overflow-y-auto py-4 px-3 mr-4\">\n {/* + Create button */}\n <button\n onClick={() => openModal('create')}\n className=\"flex items-center gap-2 rounded-button bg-primary text-primary-foreground border border-primary pl-3 pr-4 py-1.5 text-sm font-semibold hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-all mb-6 w-fit\"\n >\n <Plus className=\"h-4 w-4\" />\n {t('agenda.sidebar.create')}\n </button>\n\n {/* Mini month calendar */}\n <MiniCalendar selectedDate={selectedDate} onDateSelect={handleMiniDateSelect} />\n\n <div className=\"h-px bg-border my-4\" />\n\n {/* Agendas */}\n <button onClick={() => setProfSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Agendas</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${profSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {profSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {professionals.map((prof) => {\n const active = selectedProfIds.length === 0 || selectedProfIds.includes(prof.id)\n return (\n <label key={prof.id} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors ${\n active ? 'border-primary bg-primary' : 'border-muted-foreground/30'\n }`}>\n {active && <svg className=\"h-2.5 w-2.5 text-primary-foreground\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs truncate ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{prof.name}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleProfessional(prof.id)} />\n </label>\n )\n })}\n </div>\n )}\n\n <div className=\"h-px bg-border my-4\" />\n\n {/* Status */}\n <button onClick={() => setStatusSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Status</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${statusSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {statusSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {config.statuses.map((st) => {\n const active = selectedStatuses.length === 0 || selectedStatuses.includes(st.value)\n return (\n <label key={st.value} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors\"\n style={{ borderColor: active ? st.color : st.color + '40', backgroundColor: active ? st.color : 'transparent' }}>\n {active && <svg className=\"h-2.5 w-2.5 text-white\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{st.label}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleStatus(st.value)} />\n </label>\n )\n })}\n </div>\n )}\n </div>\n\n {/* ═══ MAIN AREA ═══ */}\n <div className=\"flex-1 flex flex-col min-w-0 overflow-hidden\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between px-4 h-12 shrink-0 border-b\">\n <div className=\"flex items-center gap-3\">\n {/* Mobile create button */}\n <button onClick={() => openModal('create')}\n className=\"md:hidden flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Plus className=\"h-4 w-4\" />\n </button>\n\n <button onClick={handleToday}\n className=\"rounded-md border px-3 py-1 text-sm font-medium hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">\n {t('agenda.toolbar.today')}\n </button>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={handlePrev} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button onClick={handleNext} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n <h1 className=\"text-base sm:text-lg font-normal truncate\">{calendarTitle}</h1>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <div className=\"hidden sm:flex items-center gap-1\">\n {VIEW_OPTIONS.map((opt) => (\n <button key={opt.key} onClick={() => handleViewChange(opt.key)}\n className={`rounded-md px-3 py-1 text-sm transition-colors ${\n currentView === opt.key\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}>\n {t(opt.labelKey)}\n </button>\n ))}\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => window.location.hash = '/settings/agenda'}\n title=\"Agenda Settings\"\n className=\"ml-1\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Calendar */}\n {professionalsLoading && professionals.length === 0 ? (\n <CalendarSkeleton profCount={2} />\n ) : (\n <div ref={wrapperRef} className=\"flex-1 overflow-hidden agenda-calendar\">\n <FullCalendar\n ref={calendarRef}\n plugins={[dayGridPlugin, timeGridPlugin, resourceTimeGridPlugin, interactionPlugin, listPlugin]}\n initialView={prefs.get('calendarView') === 'timeGridWeek' ? 'resourceTimeGridWeek' : prefs.get('calendarView')}\n schedulerLicenseKey=\"CC-Attribution-NonCommercial-NoDerivatives\"\n resources={resources}\n events={events}\n headerToolbar={false}\n locale={fcLocale}\n height=\"100%\"\n slotMinTime={effectiveBusinessHours.startTime + ':00'}\n slotMaxTime={effectiveBusinessHours.endTime + ':00'}\n slotDuration={{ minutes: config.slotDuration }}\n allDaySlot={false}\n nowIndicator={true}\n editable={config.modules.dragAndDrop}\n selectable={true}\n selectMirror={true}\n eventOverlap={false}\n datesSet={handleDatesSet}\n eventDidMount={handleEventDidMount}\n eventClick={handleEventClick}\n eventMouseEnter={handleEventMouseEnter}\n eventMouseLeave={handleEventMouseLeave}\n select={handleSelect}\n eventDrop={handleEventDrop}\n resourceLabelContent={resourceLabelContent}\n dayHeaderContent={dayHeaderContent}\n eventContent={eventContent}\n resourceOrder=\"title\"\n stickyHeaderDates={true}\n expandRows={false}\n eventTimeFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n slotLabelFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n />\n </div>\n )}\n </div>\n\n {/* Popover — stays mounted until animation finishes */}\n {selectedBooking && popoverAnchor && popoverVisible && (\n <AppointmentPopover booking={selectedBooking} position={popoverAnchor}\n onClose={() => {\n // Called AFTER the popover's exit animation finishes\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n }}\n onEdit={(id) => {\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n openModal('edit', { bookingId: id })\n }} />\n )}\n\n {/* Context Menu */}\n {contextMenu && (\n <EventContextMenu\n booking={contextMenu.booking}\n position={{ x: contextMenu.x, y: contextMenu.y }}\n onClose={() => { setContextMenuVisible(false); setContextMenu(null) }}\n onEdit={(id) => { setContextMenuVisible(false); setContextMenu(null); openModal('edit', { bookingId: id }) }}\n />\n )}\n\n {/* No-schedule confirm */}\n <ConfirmDialog\n open={!!scheduleConfirm}\n variant=\"warning\"\n title={t('agenda.calendar.noScheduleConfirm')}\n confirmLabel={t('common.confirm')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => { const cb = scheduleConfirm?.onConfirm; setScheduleConfirm(null); cb?.() }}\n onCancel={() => setScheduleConfirm(null)}\n />\n\n {/* Modal — always mounted, Radix controls open/close animation */}\n <AppointmentModal\n open={modalState.open}\n mode={modalState.mode}\n bookingId={modalState.bookingId}\n prefill={modalState.prefill}\n initialTab={modalState.initialTab}\n onClose={closeModal}\n onCreated={(newId) => {\n // After a short delay (let calendar re-render), find the event and show popover\n setTimeout(() => {\n const booking = bookings.find((b: CalendarBooking) => b.id === newId)\n if (!booking) return\n const el = document.querySelector(`[data-booking-id=\"${newId}\"]`) as HTMLElement | null\n if (el) {\n const rect = el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }\n }, 400)\n }} />\n </div>\n )\n}\n","import React from 'react'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { AgendaContextProvider } from './AgendaContext'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\nimport { CalendarView } from './views/CalendarView'\nimport { setAgendaTenantId } from './lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Main page — clean single-page calendar, no module nav wrapper\n// ---------------------------------------------------------------------------\n\nexport function AgendaPage({ config, provider, store }: {\n config: ResolvedAgendaConfig\n provider: AgendaDataProvider\n store: StoreApi<AgendaUIState>\n}) {\n const runtime = usePluginRuntimeOptional()\n const tenantId = runtime?.context.tenant?.id\n\n React.useEffect(() => {\n setAgendaTenantId(tenantId)\n return () => setAgendaTenantId(undefined)\n }, [tenantId])\n\n return (\n <AgendaContextProvider config={config} provider={provider} store={store}>\n <CalendarView />\n </AgendaContextProvider>\n )\n}\n","import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getAgendaTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTenantId(): string | undefined {\n // Plugin-local override wins; else fall back to the app's active tenant so\n // writes stamp the right tenant_id and pass orders/bookings RLS.\n return getAgendaTenantId() ?? getActiveTenantId()\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction getClients() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return { core: supabase.schema('saas_core'), pub: supabase }\n}\n\nfunction mapBooking(row: Record<string, unknown>): CalendarBooking {\n return snakeToCamel(row) as unknown as CalendarBooking\n}\n\nfunction mapSchedule(row: Record<string, unknown>): Schedule {\n return snakeToCamel(row) as unknown as Schedule\n}\n\nfunction addMinutes(iso: string, minutes: number): string {\n const d = new Date(iso)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction unique(values: Array<string | null | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => !!value)))\n}\n\nfunction indexById(rows: any[] | null | undefined): Map<string, any> {\n return new Map((rows ?? []).filter((row) => row?.id).map((row) => [row.id, row]))\n}\n\nfunction groupBy<T>(rows: T[], getKey: (row: T) => string | null | undefined): Map<string, T[]> {\n const grouped = new Map<string, T[]>()\n for (const row of rows) {\n const key = getKey(row)\n if (!key) continue\n grouped.set(key, [...(grouped.get(key) ?? []), row])\n }\n return grouped\n}\n\nfunction getDurationMinutes(startsAt: string, endsAt: string | null | undefined): number | null {\n if (!endsAt) return null\n return Math.round((new Date(endsAt).getTime() - new Date(startsAt).getTime()) / 60000)\n}\n\nfunction mergeBookings(viewBookings: CalendarBooking[], canonicalBookings: CalendarBooking[]): CalendarBooking[] {\n const canonicalIds = new Set(canonicalBookings.map((booking) => booking.id))\n const canonicalOrderIds = new Set(canonicalBookings.map((booking) => booking.orderId).filter(Boolean))\n const merged = [\n ...canonicalBookings,\n ...viewBookings.filter((booking) => {\n if (canonicalIds.has(booking.id)) return false\n if (booking.orderId && canonicalOrderIds.has(booking.orderId)) return false\n if (canonicalOrderIds.has(booking.id)) return false\n return true\n }),\n ]\n\n return merged.sort((a, b) => new Date(a.startsAt).getTime() - new Date(b.startsAt).getTime())\n}\n\nasync function hydrateCanonicalBookings(core: any, bookings: any[]): Promise<CalendarBooking[]> {\n const personIds = unique(bookings.flatMap((booking) => [booking.party_id, booking.assignee_id]))\n const locationIds = unique(bookings.map((booking) => booking.location_id))\n const orderIds = unique(bookings.map((booking) => booking.order_id))\n const bookingIds = unique(bookings.map((booking) => booking.id))\n\n const [\n { data: persons, error: personsError },\n { data: locations, error: locationsError },\n { data: orders, error: ordersError },\n { data: items, error: itemsError },\n ] = await Promise.all([\n personIds.length\n ? core.from('persons').select('id, name, phone, email, avatar_url').in('id', personIds)\n : Promise.resolve({ data: [], error: null }),\n locationIds.length\n ? core.from('locations').select('id, name').in('id', locationIds)\n : Promise.resolve({ data: [], error: null }),\n orderIds.length\n ? core.from('orders').select('id, total, status').in('id', orderIds)\n : Promise.resolve({ data: [], error: null }),\n orderIds.length\n ? core.from('order_items').select('id, order_id, service_id, name, duration_minutes, unit_price, assignee_id, sort_order').in('order_id', orderIds)\n : Promise.resolve({ data: [], error: null }),\n ])\n\n if (personsError) throw personsError\n if (locationsError) throw locationsError\n if (ordersError) throw ordersError\n if (itemsError) throw itemsError\n\n const personsById = indexById(persons)\n const locationsById = indexById(locations)\n const ordersById = indexById(orders)\n // S4: line items come from order_items (single source), keyed by order_id.\n const itemsByOrderId = groupBy(items ?? [], (item: any) => item.order_id)\n\n return bookings.map((booking) => {\n const client = booking.party_id ? personsById.get(booking.party_id) : null\n const professional = booking.assignee_id ? personsById.get(booking.assignee_id) : null\n const location = booking.location_id ? locationsById.get(booking.location_id) : null\n const order = booking.order_id ? ordersById.get(booking.order_id) : null\n const bookingItems = ((booking.order_id ? itemsByOrderId.get(booking.order_id) : null) ?? [])\n .sort((a: any, b: any) => (a.sort_order ?? 0) - (b.sort_order ?? 0))\n .map((item: any) => ({\n id: item.id,\n serviceId: item.service_id,\n name: item.name,\n durationMinutes: item.duration_minutes,\n price: item.unit_price,\n assigneeId: item.assignee_id,\n }))\n const itemDuration = bookingItems.reduce((sum: number, item: any) => sum + (item.durationMinutes ?? 0), 0)\n\n return {\n id: booking.id,\n tenantId: booking.tenant_id,\n kind: booking.kind,\n startsAt: booking.starts_at,\n endsAt: booking.ends_at,\n status: booking.status,\n notes: booking.notes,\n orderId: booking.order_id,\n locationId: booking.location_id,\n metadata: booking.metadata ?? {},\n clientId: booking.party_id,\n clientName: client?.name ?? null,\n clientPhone: client?.phone ?? null,\n clientEmail: client?.email ?? null,\n clientAvatarUrl: client?.avatar_url ?? null,\n professionalId: booking.assignee_id,\n professionalName: professional?.name ?? null,\n professionalAvatarUrl: professional?.avatar_url ?? null,\n locationName: location?.name ?? null,\n orderTotal: order?.total ?? null,\n orderStatus: order?.status ?? null,\n services: bookingItems.length ? bookingItems : null,\n totalDurationMinutes: itemDuration || getDurationMinutes(booking.starts_at, booking.ends_at),\n createdAt: booking.created_at,\n updatedAt: booking.updated_at,\n } satisfies CalendarBooking\n })\n}\n\nasync function getCanonicalBookings(core: any, query: BookingQuery): Promise<CalendarBooking[]> {\n let q = core.from('bookings')\n .select('id, tenant_id, kind, starts_at, ends_at, status, notes, order_id, location_id, metadata, party_id, assignee_id, created_at, updated_at')\n .gte('starts_at', query.dateRange.start)\n .lte('starts_at', query.dateRange.end)\n\n if (query.kind) q = q.eq('kind', query.kind)\n if (query.statuses?.length) q = q.in('status', query.statuses)\n if (query.professionalIds?.length) q = q.in('assignee_id', query.professionalIds)\n if (query.locationId) q = q.eq('location_id', query.locationId)\n\n const { data, error } = await q.order('starts_at', { ascending: true })\n if (error) throw error\n return hydrateCanonicalBookings(core, data ?? [])\n}\n\nasync function getCanonicalBookingById(core: any, id: string): Promise<CalendarBooking | null> {\n const columns = 'id, tenant_id, kind, starts_at, ends_at, status, notes, order_id, location_id, metadata, party_id, assignee_id, created_at, updated_at'\n let { data, error } = await core.from('bookings').select(columns).eq('id', id).maybeSingle()\n if (error) throw error\n\n if (!data) {\n const fallback = await core.from('bookings').select(columns).eq('order_id', id).maybeSingle()\n if (fallback.error) throw fallback.error\n data = fallback.data\n }\n\n if (!data) return null\n const [booking] = await hydrateCanonicalBookings(core, [data])\n return booking ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Supabase Agenda Provider\n// ---------------------------------------------------------------------------\n\nexport function createSupabaseAgendaProvider(): AgendaDataProvider {\n return {\n // v_bookings is in public schema (PostgREST default)\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n const { core, pub } = getClients()\n let q = pub.from('v_bookings').select('*')\n .gte('starts_at', query.dateRange.start)\n .lte('starts_at', query.dateRange.end)\n\n if (query.kind) q = q.eq('kind', query.kind)\n if (query.statuses?.length) q = q.in('status', query.statuses)\n if (query.professionalIds?.length) q = q.in('professional_id', query.professionalIds)\n if (query.locationId) q = q.eq('location_id', query.locationId)\n\n q = q.order('starts_at', { ascending: true })\n\n const { data, error } = await q\n if (error) throw error\n const viewBookings = (data ?? []).map(mapBooking)\n const canonicalBookings = await getCanonicalBookings(core, query)\n return mergeBookings(viewBookings, canonicalBookings)\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from('v_bookings').select('*').eq('id', id).maybeSingle()\n if (error) throw error\n if (data) return mapBooking(data as Record<string, unknown>)\n return getCanonicalBookingById(core, id)\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const { core } = getClients()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const hasServices = input.services.length > 0\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 endsAt = addMinutes(input.startsAt, totalDuration || 30)\n const serviceNames = input.services.map((s: any) => s.name).join(', ')\n\n // Resolve client name for metadata (used by financial detail view)\n let contactName: string | undefined\n if (input.clientId) {\n const { data: person } = await core.from('persons').select('name').eq('id', input.clientId).single()\n contactName = person?.name as string | undefined\n }\n\n const { data: order, error: orderErr } = await core.from('orders').insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'appointment',\n status: 'scheduled',\n party_id: input.clientId || null,\n assignee_id: input.professionalId,\n location_id: input.locationId ?? null,\n subtotal: totalPrice,\n total: totalPrice,\n notes: input.notes ?? null,\n metadata: {\n source: 'agenda',\n ...(serviceNames ? { serviceNames, itemsSummary: serviceNames } : {}),\n ...(contactName ? { contactName } : {}),\n },\n }).select('id').single()\n if (orderErr) throw orderErr\n\n const { data: booking, error: bookingErr } = await core.from('bookings').insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'appointment',\n party_id: input.clientId || null,\n assignee_id: input.professionalId,\n location_id: input.locationId ?? null,\n order_id: order.id,\n starts_at: input.startsAt,\n ends_at: endsAt,\n status: 'scheduled',\n notes: input.notes ?? null,\n metadata: {\n source: 'agenda',\n ...(serviceNames ? { serviceNames, itemsSummary: serviceNames } : {}),\n ...(contactName ? { contactName } : {}),\n },\n }).select('id').single()\n if (bookingErr) throw bookingErr\n\n if (hasServices) {\n // S4: line items live ONLY in order_items now (booking_items deprecated).\n const orderItems = input.services.map((s, i) => ({\n order_id: order.id,\n service_id: s.serviceId,\n name: s.name,\n quantity: 1,\n unit_price: s.price,\n total: s.price,\n sort_order: i,\n duration_minutes: s.durationMinutes,\n assignee_id: s.assigneeId ?? input.professionalId,\n }))\n const { error: oiErr } = await core.from('order_items').insert(orderItems)\n if (oiErr) throw oiErr\n }\n\n const createdBooking = await this.getBookingById(booking.id)\n if (!createdBooking) throw new Error('Created booking did not resolve from agenda read model')\n return createdBooking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const { core } = getClients()\n const { data: existing, error: existingErr } = await core.from('bookings')\n .select('id, order_id, starts_at, assignee_id')\n .eq('id', id)\n .single()\n if (existingErr) throw existingErr\n\n const updates: Record<string, unknown> = {}\n if (data.startsAt) updates.starts_at = data.startsAt\n if (data.endsAt) updates.ends_at = data.endsAt\n if (data.status) {\n // Only update the agenda status — never touch the financial stage\n updates.status = data.status\n }\n if (data.notes !== undefined) updates.notes = data.notes\n if (data.professionalId) updates.assignee_id = data.professionalId\n if (data.clientId) updates.party_id = data.clientId\n if (data.locationId) updates.location_id = data.locationId\n\n // Recalculate totals when services are updated\n if (data.services) {\n const totalDuration = data.services.reduce((s, svc) => s + svc.durationMinutes, 0)\n const totalPrice = data.services.reduce((s, svc) => s + svc.price, 0)\n // Recalculate ends_at from startsAt + total duration\n const startsAt = data.startsAt ?? (existing?.starts_at as string | undefined)\n if (startsAt) {\n const ends = new Date(new Date(startsAt).getTime() + totalDuration * 60000)\n updates.ends_at = ends.toISOString()\n }\n }\n\n const effectiveAssigneeId = data.professionalId ?? (existing?.assignee_id as string | null | undefined) ?? null\n\n const { error } = await core.from('bookings').update(updates).eq('id', id)\n if (error) throw error\n\n // S4: services are updated only in order_items below (booking_items deprecated).\n const orderId = existing?.order_id as string | null | undefined\n if (orderId) {\n const orderUpdates: Record<string, unknown> = {}\n if (data.notes !== undefined) orderUpdates.notes = data.notes\n if (data.professionalId) orderUpdates.assignee_id = data.professionalId\n if (data.clientId) orderUpdates.party_id = data.clientId\n if (data.locationId) orderUpdates.location_id = data.locationId\n\n if (data.services) {\n const totalPrice = data.services.reduce((s, svc) => s + svc.price, 0)\n orderUpdates.subtotal = totalPrice\n orderUpdates.total = totalPrice\n }\n\n if (Object.keys(orderUpdates).length > 0) {\n const { error: orderErr } = await core.from('orders').update(orderUpdates).eq('id', orderId)\n if (orderErr) throw orderErr\n }\n\n if (data.services) {\n await core.from('order_items').delete().eq('order_id', orderId)\n if (data.services.length > 0) {\n const items = data.services.map((svc, idx) => ({\n order_id: orderId,\n service_id: svc.serviceId || null,\n name: svc.name,\n quantity: 1,\n unit_price: svc.price,\n total: svc.price,\n sort_order: idx,\n duration_minutes: svc.durationMinutes,\n assignee_id: svc.assigneeId ?? effectiveAssigneeId,\n }))\n const { error: itemErr } = await core.from('order_items').insert(items)\n if (itemErr) throw itemErr\n }\n }\n }\n\n return (await this.getBookingById(id))!\n },\n\n async deleteBooking(id: string): Promise<void> {\n const { core, pub } = getClients()\n const { data: booking, error: bookingErr } = await core.from('bookings')\n .select('order_id')\n .eq('id', id)\n .single()\n if (bookingErr) throw bookingErr\n\n const orderId = booking?.order_id as string | null | undefined\n const { count, error: movementErr } = orderId\n ? await pub.from('financial_movements').select('id', { count: 'exact', head: true }).eq('invoice_id', orderId)\n : { count: 0, error: null }\n if (movementErr) throw movementErr\n\n if (orderId && (count ?? 0) > 0) {\n // Cancel movements + order (don't delete financial records)\n await pub.from('financial_movements').update({ status: 'cancelled' }).eq('invoice_id', orderId)\n await core.from('orders').update({ status: 'cancelled' }).eq('id', orderId)\n const { error } = await core.from('bookings').update({ status: 'cancelled' }).eq('id', id)\n if (error) throw error\n } else {\n // Safe to delete — remove any movements first (FK constraint)\n if (orderId) {\n await pub.from('financial_movements').delete().eq('invoice_id', orderId)\n }\n const { error } = await core.from('bookings').delete().eq('id', id)\n if (error) throw error\n if (orderId) {\n const { error: orderErr } = await core.from('orders').delete().eq('id', orderId)\n if (orderErr) throw orderErr\n }\n }\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n return this.updateBooking(id, { status: status as BookingStatus })\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n const { core } = getClients()\n let q = core.from('bookings').select('id', { count: 'exact', head: true })\n .eq('assignee_id', params.assigneeId)\n .eq('kind', 'appointment')\n .not('status', 'in', '(\"cancelled\",\"no_show\")')\n .not('starts_at', 'is', null)\n .lt('starts_at', params.endsAt)\n .gt('ends_at', params.startsAt)\n\n if (params.excludeBookingId) {\n q = q.neq('id', params.excludeBookingId)\n }\n\n const { count, error } = await q\n if (error) throw error\n return (count ?? 0) > 0\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('get_available_slots', {\n p_tenant_id: getTenantId(),\n p_assignee_id: params.assigneeId,\n p_date: params.date,\n p_duration_minutes: params.durationMinutes,\n p_slot_interval: params.slotInterval ?? 30,\n })\n if (error) throw error\n return (data ?? []).map((row: any) => ({ start: row.slot_start, end: row.slot_end }))\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n const { core } = getClients()\n let q = core.from('schedules').select('*').eq('kind', 'working_hours')\n if (professionalId) q = q.eq('assignee_id', professionalId)\n q = q.order('day_of_week').order('starts_at')\n\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(mapSchedule)\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const { core } = getClients()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const { data, error } = await core.from('schedules').insert({\n tenant_id: tenantId,\n kind: 'working_hours',\n assignee_id: input.assigneeId,\n location_id: input.locationId ?? null,\n day_of_week: input.dayOfWeek ?? null,\n specific_date: input.specificDate ?? null,\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n is_active: input.isActive !== false,\n metadata: input.metadata ?? {},\n }).select('*').single()\n if (error) throw error\n return mapSchedule(data as Record<string, unknown>)\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const { core } = getClients()\n const { error } = await core.from('schedules').delete().eq('id', id)\n if (error) throw error\n },\n\n async getProfessionals(): Promise<Professional[]> {\n const { core } = getClients()\n const { data, error } = await core.from('persons')\n .select('id, name, avatar_url, is_active')\n .eq('kind', 'staff')\n .eq('is_active', true)\n .order('name')\n if (error) throw error\n return (data ?? []).map((p: any) => ({\n id: p.id, name: p.name, avatarUrl: p.avatar_url,\n locationId: null, locationName: null, isActive: p.is_active,\n }))\n },\n\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n const { core } = getClients()\n const { data, error } = await core.from('locations')\n .select('id, name')\n .eq('is_active', true)\n .order('name')\n if (error) throw error\n return (data ?? []).map((l: any) => ({ id: l.id, name: l.name }))\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const { pub } = getClients()\n const now = new Date().toISOString()\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n\n const { data, error } = await pub.from('v_bookings').select('*')\n .eq('status', 'scheduled')\n .gte('starts_at', now)\n .lte('starts_at', cutoff.toISOString())\n .order('starts_at')\n if (error) throw error\n return (data ?? []).map(mapBooking)\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const { core } = getClients()\n const { data: booking } = await core.from('bookings').select('metadata').eq('id', bookingId).single()\n const metadata = (booking?.metadata ?? {}) as Record<string, unknown>\n const confirmations = (metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: new Date().toISOString(), status: 'sent' })\n await core.from('bookings').update({ metadata: { ...metadata, confirmations } }).eq('id', bookingId)\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const { core } = getClients()\n const { data: existing, error: existingErr } = await core.from('bookings')\n .select('order_id')\n .eq('id', bookingId)\n .single()\n if (existingErr) throw existingErr\n\n const { error } = await core.from('bookings')\n .update({ status: 'completed' })\n .eq('id', bookingId)\n if (error) throw error\n\n const orderId = existing?.order_id as string | null | undefined\n const booking = await this.getBookingById(bookingId)\n if (!booking) throw new Error('Booking not found')\n return { booking, orderId: orderId ?? bookingId }\n },\n }\n}\n","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\nexport function createMockAgendaProvider(): AgendaDataProvider {\n const bookings: CalendarBooking[] = createSampleBookings()\n const schedules: Schedule[] = createSampleSchedules()\n const professionals: Professional[] = [...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: '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.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 const date = new Date(params.date)\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","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/saas'\nimport { toast } from '@fayz-ai/ui'\nimport { getScheduleBlockConfig, setScheduleBlockConfig } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type {\n CalendarBooking, Professional, Schedule,\n CreateBookingInput, UpdateBookingInput, BookingQuery,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface AgendaUIState {\n // Calendar data\n bookings: CalendarBooking[]\n bookingsLoading: boolean\n dateRange: { start: string; end: string }\n currentView: string\n selectedDate: string\n\n // Resources\n professionals: Professional[]\n professionalsLoading: boolean\n\n // Filters\n selectedProfessionalIds: string[]\n selectedLocationId: string | null\n selectedStatuses: string[]\n\n // Locations\n locations: Array<{ id: string; name: string }>\n\n // Schedules\n schedules: Schedule[]\n schedulesLoading: boolean\n\n // Confirmations\n pendingConfirmations: CalendarBooking[]\n confirmationsLoading: boolean\n\n // Modal state\n appointmentModal: {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n }\n\n // Actions\n fetchBookings(range: { start: string; end: string }): Promise<void>\n fetchProfessionals(): Promise<void>\n fetchLocations(): Promise<void>\n fetchSchedules(professionalId?: string): Promise<void>\n fetchConfirmations(): Promise<void>\n createBooking(input: CreateBookingInput): Promise<CalendarBooking>\n updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>\n deleteBooking(id: string): Promise<void>\n updateBookingStatus(id: string, status: string): Promise<void>\n rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>\n setFilters(filters: Partial<{ professionalIds: string[]; locationId: string | null; statuses: string[] }>): void\n setView(view: string): void\n setSelectedDate(date: string): void\n openAppointmentModal(mode: 'create' | 'edit', options?: { bookingId?: string; prefill?: Partial<CreateBookingInput> & { endsAt?: string }; initialTab?: string }): void\n closeAppointmentModal(): void\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nfunction getCurrentBookingQuery(state: AgendaUIState, dateRange = state.dateRange): BookingQuery {\n return {\n dateRange,\n professionalIds: state.selectedProfessionalIds.length ? state.selectedProfessionalIds : undefined,\n locationId: state.selectedLocationId ?? undefined,\n statuses: state.selectedStatuses.length ? state.selectedStatuses : undefined,\n }\n}\n\nexport function createAgendaStore(provider: AgendaDataProvider, financialBridge?: AgendaFinancialBridge): StoreApi<AgendaUIState> {\n return createStore<AgendaUIState>((set, get) => ({\n bookings: [],\n bookingsLoading: false,\n dateRange: { start: '', end: '' },\n currentView: 'resourceTimeGridDay',\n selectedDate: new Date().toISOString().slice(0, 10),\n\n professionals: [],\n professionalsLoading: false,\n\n selectedProfessionalIds: [],\n selectedLocationId: null,\n selectedStatuses: ['scheduled', 'confirmed', 'in_progress', 'completed'],\n\n locations: [],\n\n schedules: [],\n schedulesLoading: false,\n\n pendingConfirmations: [],\n confirmationsLoading: false,\n\n appointmentModal: { open: false, mode: 'create' },\n\n async fetchBookings(range) {\n const key = `agenda:bookings:${range.start}:${range.end}`\n return dedup(key, async () => {\n set({ bookingsLoading: true, dateRange: range })\n const state = get()\n const query = getCurrentBookingQuery(state, range)\n let bookings = await provider.getBookings(query)\n\n // Enrich with payment status if financial bridge is available\n if (financialBridge) {\n const orderIds = bookings.map((b) => b.orderId).filter((id): id is string => !!id)\n if (orderIds.length > 0) {\n try {\n const statuses = await financialBridge.resolvePaymentStatuses(orderIds)\n bookings = bookings.map((b) => {\n if (!b.orderId) return b\n const summary = statuses.get(b.orderId)\n return summary ? { ...b, paymentStatus: summary.status } : b\n })\n } catch { /* non-blocking */ }\n }\n }\n\n set({ bookings, bookingsLoading: false })\n })\n },\n\n async fetchProfessionals() {\n return dedup('agenda:professionals', async () => {\n set({ professionalsLoading: true })\n const professionals = await provider.getProfessionals()\n set({ professionals, professionalsLoading: false })\n })\n },\n\n async fetchLocations() {\n return dedup('agenda:locations', async () => {\n if (!provider.getLocations) return\n const locations = await provider.getLocations()\n set({ locations })\n // Update global schedule block config so ScheduleEditor picks up locations\n const current = getScheduleBlockConfig()\n if (current) {\n setScheduleBlockConfig({ ...current, locations })\n }\n })\n },\n\n async fetchSchedules(professionalId) {\n return dedup('agenda:schedules:' + (professionalId ?? 'all'), async () => {\n set({ schedulesLoading: true })\n const schedules = await provider.getSchedules(professionalId)\n set({ schedules, schedulesLoading: false })\n })\n },\n\n async fetchConfirmations() {\n return dedup('agenda:confirmations', async () => {\n set({ confirmationsLoading: true })\n const pendingConfirmations = await provider.getConfirmationsPending()\n set({ pendingConfirmations, confirmationsLoading: false })\n })\n },\n\n async createBooking(input) {\n try {\n const booking = await provider.createBooking(input)\n // Refresh bookings for current range\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment created')\n return booking\n } catch (err: any) {\n toast.error('Failed to create appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBooking(id, data) {\n try {\n const booking = await provider.updateBooking(id, data)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment updated')\n return booking\n } catch (err: any) {\n toast.error('Failed to update appointment', { description: err?.message })\n throw err\n }\n },\n\n async deleteBooking(id) {\n try {\n await provider.deleteBooking(id)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment deleted')\n } catch (err: any) {\n toast.error('Failed to delete appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBookingStatus(id, status) {\n // Optimistic update — change color immediately\n const prev = get().bookings\n set({ bookings: prev.map((b) => b.id === id ? { ...b, status: status as any } : b) })\n try {\n await provider.updateBookingStatus(id, status)\n // Refresh from server to get full data\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Status updated')\n } catch (err: any) {\n // Rollback on failure\n set({ bookings: prev })\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async rescheduleBooking(id, newStart, newEnd, newProfessionalId) {\n try {\n // Check for conflicts\n const existing = get().bookings.find((b) => b.id === id)\n const assigneeId = newProfessionalId ?? existing?.professionalId\n if (assigneeId) {\n const hasConflict = await provider.checkConflict({\n assigneeId,\n startsAt: newStart,\n endsAt: newEnd,\n excludeBookingId: id,\n })\n if (hasConflict) {\n toast.error('Time conflict detected', { description: 'This professional already has an appointment at this time.' })\n throw new Error('Time conflict')\n }\n }\n await provider.updateBooking(id, {\n startsAt: newStart,\n endsAt: newEnd,\n ...(newProfessionalId && { professionalId: newProfessionalId }),\n })\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment rescheduled')\n } catch (err: any) {\n if (err?.message !== 'Time conflict') {\n toast.error('Failed to reschedule', { description: err?.message })\n }\n throw err\n }\n },\n\n setFilters(filters) {\n set({\n ...(filters.professionalIds !== undefined && { selectedProfessionalIds: filters.professionalIds }),\n ...(filters.locationId !== undefined && { selectedLocationId: filters.locationId }),\n ...(filters.statuses !== undefined && { selectedStatuses: filters.statuses }),\n })\n // Re-fetch with new filters\n const { dateRange } = get()\n if (dateRange.start && dateRange.end) {\n get().fetchBookings(dateRange)\n }\n },\n\n setView(view) { set({ currentView: view }) },\n setSelectedDate(date) { set({ selectedDate: date }) },\n\n openAppointmentModal(mode, options) {\n set({ appointmentModal: { open: true, mode, bookingId: options?.bookingId, prefill: options?.prefill, initialTab: options?.initialTab } })\n },\n\n closeAppointmentModal() {\n // Only toggle open — keep mode/bookingId/prefill intact so layout\n // doesn't shift during the close animation\n set((state) => ({ appointmentModal: { ...state.appointmentModal, open: false } }))\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Holidays (saas_core.holidays — tenant-scoped)\n// ---------------------------------------------------------------------------\n\nconst holidayEntity: EntityDef = {\n name: 'Holiday',\n namePlural: 'Holidays',\n icon: 'TreePalm',\n displayField: 'name',\n defaultSort: 'date',\n defaultSortDir: 'asc',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'date', label: 'Date', type: 'date', required: true, showInTable: true, sortable: true },\n { key: 'recurring', label: 'Recurring Annually', type: 'boolean', showInTable: true, defaultValue: false },\n { key: 'description', label: 'Description', type: 'text', showInTable: false },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: {\n table: 'holidays',\n schema: 'saas_core',\n tenantScoped: true,\n },\n}\n\nexport const agendaRegistries: PluginRegistryDef[] = [\n {\n id: 'holidays',\n entity: holidayEntity,\n icon: 'TreePalm',\n description: 'Non-working days and recurring holidays',\n },\n]\n","import React from 'react'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\n\nconst HOUR_OPTIONS = Array.from({ length: 18 }, (_, i) => {\n const h = (5 + i).toString().padStart(2, '0')\n return { value: `${h}:00`, label: `${h}:00` }\n})\n\nexport function AgendaGeneralSettings() {\n const t = useTranslation()\n const { startTime, endTime, setStartTime, setEndTime } = useAgendaSettings()\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title={t('agenda.settings.scheduling')} description={t('agenda.settings.schedulingDesc')}>\n <ToggleRow label={t('agenda.settings.conflictDetection')} description={t('agenda.settings.conflictDetectionDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.dragDrop')} description={t('agenda.settings.dragDropDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoCreateOrder')} description={t('agenda.settings.autoCreateOrderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.locations')} description={t('agenda.settings.locationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableLocation')} description={t('agenda.settings.enableLocationDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.workingHours')} description={t('agenda.settings.workingHoursDesc')}>\n <ToggleRow label={t('agenda.settings.enableWorkingHours')} description={t('agenda.settings.enableWorkingHoursDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.blockOutside')} description={t('agenda.settings.blockOutsideDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.confirmations')} description={t('agenda.settings.confirmationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableConfirmations')} description={t('agenda.settings.enableConfirmationsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoConfirm')} description={t('agenda.settings.autoConfirmDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.reminder')} description={t('agenda.settings.reminderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.calendarDisplay')} description={t('agenda.settings.calendarDisplayDesc')}>\n <SelectRow\n label={t('agenda.settings.dayStartTime')}\n description={t('agenda.settings.dayStartTimeDesc')}\n value={startTime}\n options={HOUR_OPTIONS}\n onChange={setStartTime}\n />\n <SelectRow\n label={t('agenda.settings.dayEndTime')}\n description={t('agenda.settings.dayEndTimeDesc')}\n value={endTime}\n options={HOUR_OPTIONS}\n onChange={setEndTime}\n />\n <ToggleRow label={t('agenda.settings.showCancelled')} description={t('agenda.settings.showCancelledDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.showNoShow')} description={t('agenda.settings.showNoShowDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.compact')} description={t('agenda.settings.compactDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.notifications')} description={t('agenda.settings.notificationsDesc')}>\n <ToggleRow label={t('agenda.settings.newBookingNotif')} description={t('agenda.settings.newBookingNotifDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.cancelAlerts')} description={t('agenda.settings.cancelAlertsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.noShowTracking')} description={t('agenda.settings.noShowTrackingDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n </div>\n )\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const en: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Add description...\",\n \"agenda.appointment.addService\": \"Add service\",\n \"agenda.appointment.cancel\": \"Cancel\",\n \"agenda.appointment.clientTab\": \"Client\",\n \"agenda.appointment.noClientData\": \"No client data available\",\n \"agenda.appointment.client\": \"Client\",\n \"agenda.appointment.conflict\": \"Time conflict — this professional is already booked at this time.\",\n \"agenda.appointment.create\": \"Create\",\n \"agenda.appointment.createClientFailed\": \"Failed to create client\",\n \"agenda.appointment.creating\": \"Creating...\",\n \"agenda.appointment.delete\": \"Delete\",\n \"agenda.appointment.deleteConfirm\": \"Delete this appointment?\",\n \"agenda.appointment.confirmDelete\": \"Delete\",\n \"agenda.appointment.deleting\": \"Deleting…\",\n \"agenda.appointment.edit\": \"Edit Appointment\",\n \"agenda.appointment.emailOptional\": \"Email (optional)\",\n \"agenda.appointment.location\": \"Location\",\n \"agenda.appointment.name\": \"Name\",\n \"agenda.appointment.new\": \"New Appointment\",\n \"agenda.appointment.newClient\": \"New client\",\n \"agenda.appointment.notes\": \"Notes\",\n \"agenda.appointment.phone\": \"Phone\",\n \"agenda.appointment.professional\": \"Professional\",\n \"agenda.appointment.save\": \"Save\",\n \"agenda.appointment.saving\": \"Saving...\",\n \"agenda.appointment.searchClient\": \"Search client...\",\n \"agenda.appointment.searchService\": \"Search service to add...\",\n \"agenda.appointment.selectLocation\": \"Select location...\",\n \"agenda.appointment.selectProfessional\": \"Select professional...\",\n \"agenda.appointment.services\": \"Services\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"to\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Update\",\n \"agenda.payment.title\": \"Payment\",\n \"agenda.payment.generateInvoice\": \"Generate invoice\",\n \"agenda.payment.generating\": \"Generating…\",\n \"agenda.payment.pending\": \"Pending\",\n \"agenda.payment.partial\": \"Partial\",\n \"agenda.payment.paid\": \"Paid\",\n \"agenda.payment.collect\": \"Collect\",\n \"agenda.payment.overdue\": \"Overdue\",\n \"agenda.payment.cancelled\": \"Cancelled\",\n \"agenda.payment.none\": \"Payment\",\n \"agenda.payment.pay\": \"Pay\",\n \"agenda.payment.paying\": \"Paying…\",\n \"agenda.payment.remaining\": \"Remaining\",\n \"agenda.payment.installment\": \"Installment\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"No invoice generated\",\n \"agenda.payment.selectAccount\": \"Select account\",\n \"agenda.payment.registerPayment\": \"Register payment\",\n \"agenda.payment.registerPaymentHint\": \"Record a payment for this appointment\",\n \"agenda.payment.pendingHint\": \"Invoice generated, awaiting payment\",\n \"agenda.payment.partialHint\": \"Partially paid, tap to complete\",\n \"agenda.payment.paidHint\": \"Payment completed\",\n \"agenda.payment.overdueHint\": \"Payment overdue\",\n \"agenda.payment.backToAppointment\": \"Back to appointment\",\n \"agenda.payment.checkout\": \"Confirm\",\n \"agenda.payment.checkingOut\": \"Processing…\",\n \"agenda.payment.serviceSummary\": \"Service summary\",\n \"agenda.payment.paymentMethod\": \"Payment method\",\n \"agenda.payment.noMethods\": \"No payment methods configured.\",\n \"agenda.payment.configureMethods\": \"Set up payment methods\",\n \"agenda.payment.checkoutComplete\": \"Payment confirmed\",\n \"agenda.payment.card\": \"Card\",\n \"agenda.payment.method\": \"Method\",\n \"agenda.payment.select\": \"Select…\",\n \"agenda.payment.cardBrand\": \"Brand\",\n \"agenda.payment.selectBrand\": \"Select brand…\",\n \"agenda.payment.cardInstallments\": \"Installments\",\n \"agenda.payment.bankAccount\": \"Account\",\n \"agenda.payment.viewInvoice\": \"View invoice details\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Create\",\n \"agenda.calendar.next\": \"Next\",\n \"agenda.calendar.previous\": \"Previous\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Today\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Day\",\n \"agenda.calendar.viewMonth\": \"Month\",\n \"agenda.calendar.viewWeek\": \"Week\",\n \"agenda.confirmations.confirmed\": \"Confirmed:\",\n \"agenda.confirmations.empty\": \"No pending confirmations\",\n \"agenda.confirmations.emptySubtitle\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.loading\": \"Loading...\",\n \"agenda.confirmations.subtitle\": \"Upcoming appointments pending confirmation\",\n \"agenda.confirmations.unknownClient\": \"Unknown client\",\n \"agenda.confirmations.sendWhatsApp\": \"Send WhatsApp\",\n \"agenda.confirmations.call\": \"Call\",\n \"agenda.confirmations.markConfirmed\": \"Mark Confirmed\",\n \"agenda.confirmations.markCancelled\": \"Mark Cancelled\",\n \"agenda.contextMenu.changeStatus\": \"Change status\",\n \"agenda.contextMenu.delete\": \"Delete\",\n \"agenda.contextMenu.edit\": \"Edit\",\n \"agenda.contextMenu.notAvailable\": \"(not available)\",\n \"agenda.index.settingsSubtitle\": \"Working hours, scheduling preferences, and confirmations\",\n \"agenda.index.settingsTitle\": \"Agenda Settings\",\n \"settings.plugin.agenda-working-hours\": \"Working Hours\",\n \"agenda.popover.unknown\": \"Unknown\",\n \"agenda.settings.autoConfirm\": \"Auto-confirm\",\n \"agenda.settings.autoConfirmDesc\": \"Automatically confirm new bookings\",\n \"agenda.settings.autoCreateOrder\": \"Auto-create Order\",\n \"agenda.settings.autoCreateOrderDesc\": \"Automatically create a financial order for new bookings\",\n \"agenda.settings.blockOutside\": \"Block Outside Hours\",\n \"agenda.settings.blockOutsideDesc\": \"Prevent bookings outside working hours\",\n \"agenda.settings.calendarDisplay\": \"Calendar Display\",\n \"agenda.settings.calendarDisplayDesc\": \"Visual settings for the calendar\",\n \"agenda.settings.cancelAlerts\": \"Cancellation Alerts\",\n \"agenda.settings.cancelAlertsDesc\": \"Notify when a booking is cancelled\",\n \"agenda.settings.compact\": \"Compact Mode\",\n \"agenda.settings.compactDesc\": \"Use smaller event blocks\",\n \"agenda.settings.confirmations\": \"Confirmations\",\n \"agenda.settings.confirmationsDesc\": \"Booking confirmation settings\",\n \"agenda.settings.conflictDetection\": \"Conflict Detection\",\n \"agenda.settings.conflictDetectionDesc\": \"Warn when bookings overlap\",\n \"agenda.settings.dragDrop\": \"Drag & Drop\",\n \"agenda.settings.dragDropDesc\": \"Allow rescheduling by dragging events\",\n \"agenda.settings.enableConfirmations\": \"Enable Confirmations\",\n \"agenda.settings.enableConfirmationsDesc\": \"Require confirmation for new bookings\",\n \"agenda.settings.enableLocation\": \"Enable Location Selection\",\n \"agenda.settings.enableLocationDesc\": \"Show location picker in booking modal\",\n \"agenda.settings.enableWorkingHours\": \"Enable Working Hours\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Show working hours overlay on calendar\",\n \"agenda.settings.locations\": \"Locations\",\n \"agenda.settings.locationsDesc\": \"Multi-location settings\",\n \"agenda.settings.newBookingNotif\": \"New Booking Alerts\",\n \"agenda.settings.newBookingNotifDesc\": \"Notify when a new booking is created\",\n \"agenda.settings.noShowTracking\": \"No-show Tracking\",\n \"agenda.settings.noShowTrackingDesc\": \"Track and alert on no-shows\",\n \"agenda.settings.notifications\": \"Notifications\",\n \"agenda.settings.notificationsDesc\": \"Notification preferences\",\n \"agenda.settings.reminder\": \"Reminders\",\n \"agenda.settings.reminderDesc\": \"Send reminders before appointments\",\n \"agenda.settings.scheduling\": \"Scheduling\",\n \"agenda.settings.schedulingDesc\": \"Configure scheduling behavior\",\n \"agenda.settings.showCancelled\": \"Show Cancelled\",\n \"agenda.settings.showCancelledDesc\": \"Display cancelled bookings on calendar\",\n \"agenda.settings.showNoShow\": \"Show No-shows\",\n \"agenda.settings.showNoShowDesc\": \"Display no-show bookings on calendar\",\n \"agenda.settings.workingHours\": \"Working Hours\",\n \"agenda.settings.workingHoursDesc\": \"Working hours and availability\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"All locations\",\n \"agenda.sidebar.create\": \"Create\",\n \"agenda.sidebar.location\": \"Location\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Next\",\n \"agenda.toolbar.previous\": \"Previous\",\n \"agenda.toolbar.today\": \"Today\",\n \"agenda.workingHours.addBreak\": \"Add break\",\n \"agenda.workingHours.copyToAll\": \"Copy to all\",\n \"agenda.workingHours.dayOff\": \"Day off\",\n \"agenda.workingHours.removePeriod\": \"Remove period\",\n \"agenda.workingHours.professional\": \"Professional\",\n \"agenda.workingHours.save\": \"Save\",\n \"agenda.workingHours.saveFailed\": \"Failed to save\",\n \"agenda.workingHours.saved\": \"Working hours saved\",\n \"agenda.workingHours.saving\": \"Saving...\",\n \"agenda.workingHours.subtitle\": \"Manage working hours per professional\",\n \"agenda.workingHours.to\": \"to\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendar\",\n \"agenda.calendar.noScheduleConfirm\": \"This time slot has no open schedule for this professional. Do you want to book anyway?\",\n \"agenda.calendar.newAppointment\": \"New Appointment\",\n \"agenda.booking.create\": \"New Appointment\",\n \"agenda.booking.edit\": \"Edit Appointment\",\n \"agenda.booking.delete\": \"Delete Appointment\",\n \"agenda.booking.deleteConfirm\": \"Are you sure you want to delete this appointment?\",\n \"agenda.booking.client\": \"Client\",\n \"agenda.booking.professional\": \"Professional\",\n \"agenda.booking.services\": \"Services\",\n \"agenda.booking.date\": \"Date\",\n \"agenda.booking.time\": \"Time\",\n \"agenda.booking.duration\": \"Duration\",\n \"agenda.booking.notes\": \"Notes\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Save Appointment\",\n \"agenda.booking.saving\": \"Saving...\",\n \"agenda.confirmations.title\": \"Confirmations\",\n \"agenda.confirmations.pending\": \"Pending Confirmations\",\n \"agenda.confirmations.emptyDescription\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.confirm\": \"Confirm\",\n \"agenda.confirmations.cancel\": \"Cancel\",\n \"agenda.workingHours.title\": \"Working Hours\",\n \"agenda.workingHours.addPeriod\": \"Add period\",\n \"agenda.workingHours.loading\": \"Loading...\",\n \"agenda.appointment.addClient\": \"Add client\",\n \"agenda.appointment.addServiceFirst\": \"Add service\",\n \"agenda.appointment.addNotes\": \"Add notes\",\n \"agenda.appointment.duration\": \"Duration (minutes)\",\n \"agenda.appointment.price\": \"Price\",\n \"agenda.bookingType.appointment\": \"Appointment\",\n \"agenda.bookingType.task\": \"Task\",\n \"agenda.bookingType.out_of_office\": \"Out of Office\",\n \"agenda.bookingType.block\": \"Block\",\n \"agenda.settings.title\": \"Agenda Settings\",\n \"agenda.settings.slotDuration\": \"Slot Duration\",\n \"agenda.settings.bookingKind\": \"Booking Kind\",\n \"agenda.settings.dayStartTime\": \"Day Start Time\",\n \"agenda.settings.dayStartTimeDesc\": \"First hour shown on the calendar\",\n \"agenda.settings.dayEndTime\": \"Day End Time\",\n \"agenda.settings.dayEndTimeDesc\": \"Last hour shown on the calendar\",\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const ptBR: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Adicionar descrição...\",\n \"agenda.appointment.addService\": \"Adicionar serviço\",\n \"agenda.appointment.cancel\": \"Cancelar\",\n \"agenda.appointment.clientTab\": \"Cliente\",\n \"agenda.appointment.noClientData\": \"Dados do cliente não disponíveis\",\n \"agenda.appointment.client\": \"Cliente\",\n \"agenda.appointment.conflict\": \"Conflito de horário — este profissional já está reservado neste horário.\",\n \"agenda.appointment.create\": \"Criar\",\n \"agenda.appointment.createClientFailed\": \"Falha ao criar cliente\",\n \"agenda.appointment.creating\": \"Criando...\",\n \"agenda.appointment.delete\": \"Excluir\",\n \"agenda.appointment.deleteConfirm\": \"Excluir este agendamento?\",\n \"agenda.appointment.confirmDelete\": \"Excluir\",\n \"agenda.appointment.deleting\": \"Excluindo…\",\n \"agenda.appointment.edit\": \"Editar Agendamento\",\n \"agenda.appointment.emailOptional\": \"E-mail (opcional)\",\n \"agenda.appointment.location\": \"Local\",\n \"agenda.appointment.name\": \"Nome\",\n \"agenda.appointment.new\": \"Novo Agendamento\",\n \"agenda.appointment.newClient\": \"Novo cliente\",\n \"agenda.appointment.notes\": \"Observações\",\n \"agenda.appointment.phone\": \"Telefone\",\n \"agenda.appointment.professional\": \"Profissional\",\n \"agenda.appointment.save\": \"Salvar\",\n \"agenda.appointment.saving\": \"Salvando...\",\n \"agenda.appointment.searchClient\": \"Buscar cliente...\",\n \"agenda.appointment.searchService\": \"Buscar serviço para adicionar...\",\n \"agenda.appointment.selectLocation\": \"Selecionar local...\",\n \"agenda.appointment.selectProfessional\": \"Selecionar profissional...\",\n \"agenda.appointment.services\": \"Serviços\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"até\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Atualizar\",\n \"agenda.payment.title\": \"Recebimento\",\n \"agenda.payment.generateInvoice\": \"Gerar recebimento\",\n \"agenda.payment.generating\": \"Gerando…\",\n \"agenda.payment.pending\": \"Pendente\",\n \"agenda.payment.partial\": \"Parcial\",\n \"agenda.payment.paid\": \"Pago\",\n \"agenda.payment.collect\": \"Receber\",\n \"agenda.payment.overdue\": \"Vencido\",\n \"agenda.payment.cancelled\": \"Cancelado\",\n \"agenda.payment.none\": \"Recebimento\",\n \"agenda.payment.pay\": \"Pagar\",\n \"agenda.payment.paying\": \"Pagando…\",\n \"agenda.payment.remaining\": \"Restante\",\n \"agenda.payment.installment\": \"Parcela\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"Sem recebimento gerado\",\n \"agenda.payment.selectAccount\": \"Selecionar conta\",\n \"agenda.payment.registerPayment\": \"Registrar recebimento\",\n \"agenda.payment.registerPaymentHint\": \"Registrar pagamento deste agendamento\",\n \"agenda.payment.pendingHint\": \"Fatura gerada, aguardando pagamento\",\n \"agenda.payment.partialHint\": \"Parcialmente pago, toque para completar\",\n \"agenda.payment.paidHint\": \"Pagamento realizado\",\n \"agenda.payment.overdueHint\": \"Pagamento vencido\",\n \"agenda.payment.backToAppointment\": \"Voltar ao agendamento\",\n \"agenda.payment.checkout\": \"Confirmar\",\n \"agenda.payment.checkingOut\": \"Processando…\",\n \"agenda.payment.serviceSummary\": \"Resumo do atendimento\",\n \"agenda.payment.paymentMethod\": \"Forma de pagamento\",\n \"agenda.payment.noMethods\": \"Nenhuma forma de pagamento configurada.\",\n \"agenda.payment.configureMethods\": \"Configurar formas de pagamento\",\n \"agenda.payment.checkoutComplete\": \"Pagamento confirmado\",\n \"agenda.payment.card\": \"Cartão\",\n \"agenda.payment.method\": \"Método\",\n \"agenda.payment.select\": \"Selecionar…\",\n \"agenda.payment.cardBrand\": \"Bandeira\",\n \"agenda.payment.selectBrand\": \"Selecionar bandeira…\",\n \"agenda.payment.cardInstallments\": \"Parcelas\",\n \"agenda.payment.bankAccount\": \"Conta\",\n \"agenda.payment.viewInvoice\": \"Ver detalhes da fatura\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Criar\",\n \"agenda.calendar.next\": \"Próximo\",\n \"agenda.calendar.previous\": \"Anterior\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Hoje\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Dia\",\n \"agenda.calendar.viewMonth\": \"Mês\",\n \"agenda.calendar.viewWeek\": \"Semana\",\n \"agenda.confirmations.confirmed\": \"Confirmado:\",\n \"agenda.confirmations.empty\": \"Nenhuma confirmação pendente\",\n \"agenda.confirmations.emptySubtitle\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.loading\": \"Carregando...\",\n \"agenda.confirmations.subtitle\": \"Agendamentos futuros pendentes de confirmação\",\n \"agenda.confirmations.unknownClient\": \"Cliente desconhecido\",\n \"agenda.confirmations.sendWhatsApp\": \"Enviar WhatsApp\",\n \"agenda.confirmations.call\": \"Ligar\",\n \"agenda.confirmations.markConfirmed\": \"Marcar Confirmado\",\n \"agenda.confirmations.markCancelled\": \"Marcar Cancelado\",\n \"agenda.contextMenu.changeStatus\": \"Alterar status\",\n \"agenda.contextMenu.delete\": \"Excluir\",\n \"agenda.contextMenu.edit\": \"Editar\",\n \"agenda.contextMenu.notAvailable\": \"(indisponível)\",\n \"agenda.index.settingsSubtitle\": \"Horários de funcionamento, preferências de agendamento e confirmações\",\n \"agenda.index.settingsTitle\": \"Configurações da Agenda\",\n \"settings.plugin.agenda-working-hours\": \"Horário de Funcionamento\",\n \"agenda.popover.unknown\": \"Desconhecido\",\n \"agenda.settings.autoConfirm\": \"Confirmar Automaticamente\",\n \"agenda.settings.autoConfirmDesc\": \"Confirmar automaticamente novos agendamentos\",\n \"agenda.settings.autoCreateOrder\": \"Criar Pedido Automaticamente\",\n \"agenda.settings.autoCreateOrderDesc\": \"Criar automaticamente um pedido financeiro para novos agendamentos\",\n \"agenda.settings.blockOutside\": \"Bloquear Fora do Horário\",\n \"agenda.settings.blockOutsideDesc\": \"Impedir agendamentos fora do horário de funcionamento\",\n \"agenda.settings.calendarDisplay\": \"Exibição do Calendário\",\n \"agenda.settings.calendarDisplayDesc\": \"Configurações visuais do calendário\",\n \"agenda.settings.cancelAlerts\": \"Alertas de Cancelamento\",\n \"agenda.settings.cancelAlertsDesc\": \"Notificar quando um agendamento é cancelado\",\n \"agenda.settings.compact\": \"Modo Compacto\",\n \"agenda.settings.compactDesc\": \"Usar blocos de eventos menores\",\n \"agenda.settings.confirmations\": \"Confirmações\",\n \"agenda.settings.confirmationsDesc\": \"Configurações de confirmação de agendamento\",\n \"agenda.settings.conflictDetection\": \"Detecção de Conflitos\",\n \"agenda.settings.conflictDetectionDesc\": \"Alertar quando agendamentos se sobrepõem\",\n \"agenda.settings.dragDrop\": \"Arrastar e Soltar\",\n \"agenda.settings.dragDropDesc\": \"Permitir reagendamento arrastando eventos\",\n \"agenda.settings.enableConfirmations\": \"Habilitar Confirmações\",\n \"agenda.settings.enableConfirmationsDesc\": \"Exigir confirmação para novos agendamentos\",\n \"agenda.settings.enableLocation\": \"Habilitar Seleção de Local\",\n \"agenda.settings.enableLocationDesc\": \"Mostrar seletor de local no modal de agendamento\",\n \"agenda.settings.enableWorkingHours\": \"Habilitar Horário de Funcionamento\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Mostrar sobreposição de horário de funcionamento no calendário\",\n \"agenda.settings.locations\": \"Locais\",\n \"agenda.settings.locationsDesc\": \"Configurações de múltiplos locais\",\n \"agenda.settings.newBookingNotif\": \"Alertas de Novo Agendamento\",\n \"agenda.settings.newBookingNotifDesc\": \"Notificar quando um novo agendamento é criado\",\n \"agenda.settings.noShowTracking\": \"Rastreamento de Ausências\",\n \"agenda.settings.noShowTrackingDesc\": \"Rastrear e alertar sobre ausências\",\n \"agenda.settings.notifications\": \"Notificações\",\n \"agenda.settings.notificationsDesc\": \"Preferências de notificação\",\n \"agenda.settings.reminder\": \"Lembretes\",\n \"agenda.settings.reminderDesc\": \"Enviar lembretes antes dos compromissos\",\n \"agenda.settings.scheduling\": \"Agendamento\",\n \"agenda.settings.schedulingDesc\": \"Configurar comportamento do agendamento\",\n \"agenda.settings.showCancelled\": \"Mostrar Cancelados\",\n \"agenda.settings.showCancelledDesc\": \"Exibir agendamentos cancelados no calendário\",\n \"agenda.settings.showNoShow\": \"Mostrar Ausências\",\n \"agenda.settings.showNoShowDesc\": \"Exibir ausências no calendário\",\n \"agenda.settings.workingHours\": \"Horário de Funcionamento\",\n \"agenda.settings.workingHoursDesc\": \"Horários e disponibilidade\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"Todos os locais\",\n \"agenda.sidebar.create\": \"Criar\",\n \"agenda.sidebar.location\": \"Local\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Próximo\",\n \"agenda.toolbar.previous\": \"Anterior\",\n \"agenda.toolbar.today\": \"Hoje\",\n \"agenda.workingHours.addBreak\": \"Adicionar intervalo\",\n \"agenda.workingHours.copyToAll\": \"Copiar para todos\",\n \"agenda.workingHours.dayOff\": \"Folga\",\n \"agenda.workingHours.removePeriod\": \"Remover período\",\n \"agenda.workingHours.professional\": \"Profissional\",\n \"agenda.workingHours.save\": \"Salvar\",\n \"agenda.workingHours.saveFailed\": \"Falha ao salvar\",\n \"agenda.workingHours.saved\": \"Horários de trabalho salvos\",\n \"agenda.workingHours.saving\": \"Salvando...\",\n \"agenda.workingHours.subtitle\": \"Gerenciar horários de trabalho por profissional\",\n \"agenda.workingHours.to\": \"até\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendário\",\n \"agenda.calendar.noScheduleConfirm\": \"Este horário não possui agenda aberta para este profissional. Deseja agendar mesmo assim?\",\n \"agenda.calendar.newAppointment\": \"Novo Agendamento\",\n \"agenda.booking.create\": \"Novo Agendamento\",\n \"agenda.booking.edit\": \"Editar Agendamento\",\n \"agenda.booking.delete\": \"Excluir Agendamento\",\n \"agenda.booking.deleteConfirm\": \"Tem certeza que deseja excluir este agendamento?\",\n \"agenda.booking.client\": \"Cliente\",\n \"agenda.booking.professional\": \"Profissional\",\n \"agenda.booking.services\": \"Serviços\",\n \"agenda.booking.date\": \"Data\",\n \"agenda.booking.time\": \"Horário\",\n \"agenda.booking.duration\": \"Duração\",\n \"agenda.booking.notes\": \"Observações\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Salvar Agendamento\",\n \"agenda.booking.saving\": \"Salvando...\",\n \"agenda.confirmations.title\": \"Confirmações\",\n \"agenda.confirmations.pending\": \"Confirmações Pendentes\",\n \"agenda.confirmations.emptyDescription\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.confirm\": \"Confirmar\",\n \"agenda.confirmations.cancel\": \"Cancelar\",\n \"agenda.workingHours.title\": \"Horário de Trabalho\",\n \"agenda.workingHours.addPeriod\": \"Adicionar período\",\n \"agenda.workingHours.loading\": \"Carregando...\",\n \"agenda.appointment.addClient\": \"Adicionar cliente\",\n \"agenda.appointment.addServiceFirst\": \"Adicionar serviço\",\n \"agenda.appointment.addNotes\": \"Adicionar observações\",\n \"agenda.appointment.duration\": \"Duração (minutos)\",\n \"agenda.appointment.price\": \"Preço\",\n \"agenda.bookingType.appointment\": \"Agendamento\",\n \"agenda.bookingType.task\": \"Tarefa\",\n \"agenda.bookingType.out_of_office\": \"Ausência\",\n \"agenda.bookingType.block\": \"Bloqueio\",\n \"agenda.settings.title\": \"Configurações da Agenda\",\n \"agenda.settings.slotDuration\": \"Duração do Intervalo\",\n \"agenda.settings.bookingKind\": \"Tipo de Agendamento\",\n \"agenda.settings.dayStartTime\": \"Horário de Início\",\n \"agenda.settings.dayStartTimeDesc\": \"Primeiro horário exibido no calendário\",\n \"agenda.settings.dayEndTime\": \"Horário de Término\",\n \"agenda.settings.dayEndTimeDesc\": \"Último horário exibido no calendário\",\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const agendaLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","// ---------------------------------------------------------------------------\n// Bridge factory: adapts FinancialDataProvider → AgendaFinancialBridge\n// Consumer apps call this at plugin wiring time.\n// ---------------------------------------------------------------------------\n\nimport type { FinancialDataProvider } from '@fayz-ai/plugin-financial'\nimport type { AgendaFinancialBridge, BookingPaymentSummary, BookingPaymentDetail, BookingPaymentStatus } from '../financial-bridge'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n/**\n * Pure commission math: percentage of a realized order total, rounded to cents.\n * Exported for unit-testing and reuse; the bridge method below wraps the I/O.\n * Returns 0 for a non-positive base or rate so callers can skip empty accruals.\n */\nexport function computeCommissionAmount(total: number, ratePercent: number): number {\n const base = Number(total) || 0\n const rate = Number(ratePercent) || 0\n if (base <= 0 || rate <= 0) return 0\n return Math.round(base * (rate / 100) * 100) / 100\n}\n\nfunction computeStatus(movements: Array<{ status: string }>): BookingPaymentStatus {\n if (movements.length === 0) return 'none'\n const allPaid = movements.every((m) => m.status === 'paid')\n if (allPaid) return 'paid'\n const allCancelled = movements.every((m) => m.status === 'cancelled')\n if (allCancelled) return 'cancelled'\n const anyOverdue = movements.some((m) => m.status === 'overdue')\n if (anyOverdue) return 'overdue'\n const anyPaid = movements.some((m) => m.status === 'paid' || m.status === 'partial')\n if (anyPaid) return 'partial'\n return 'pending'\n}\n\n/**\n * Create an AgendaFinancialBridge backed by the financial plugin's data provider.\n *\n * @example\n * const financialProvider = createSupabaseFinancialProvider()\n * const agenda = createAgendaPlugin({\n * financialBridge: createFinancialBridge(financialProvider),\n * })\n */\nexport function createFinancialBridge(provider: FinancialDataProvider): AgendaFinancialBridge {\n return {\n async resolvePaymentStatuses(orderIds: string[]): Promise<Map<string, BookingPaymentSummary>> {\n const result = new Map<string, BookingPaymentSummary>()\n if (orderIds.length === 0) return result\n\n // Single batch query instead of N individual getInvoiceById calls\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return result\n\n try {\n const [{ data: orders }, { data: movements }] = await Promise.all([\n supabase\n .schema('saas_core')\n .from('orders')\n .select('id, kind, status, total, reference_number, metadata')\n .in('id', orderIds),\n supabase\n .from('financial_movements')\n .select('invoice_id, status, paid_amount')\n .in('invoice_id', orderIds),\n ])\n\n const movementsByOrderId = new Map<string, Array<{ status: string; paid_amount: number }>>()\n for (const movement of movements ?? []) {\n const invoiceId = movement.invoice_id as string | undefined\n if (!invoiceId) continue\n movementsByOrderId.set(invoiceId, [...(movementsByOrderId.get(invoiceId) ?? []), movement])\n }\n\n for (const order of orders ?? []) {\n const orderMovements = movementsByOrderId.get(order.id) ?? []\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n const paidAmount = orderMovements.length > 0\n ? orderMovements.reduce((sum, movement) => sum + (Number(movement.paid_amount) || 0), 0)\n : Number(meta.paidAmount) || 0\n\n result.set(order.id, {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: orderMovements.length > 0 ? computeStatus(orderMovements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount,\n })\n }\n } catch { /* non-blocking */ }\n\n return result\n },\n\n async getPaymentDetail(orderId: string): Promise<BookingPaymentDetail | null> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Single query: get order + movements in parallel\n const [orderRes, movRes] = await Promise.all([\n supabase.schema('saas_core').from('orders').select('id, status, total, reference_number, metadata').eq('id', orderId).single(),\n supabase.from('financial_movements').select('*').eq('invoice_id', orderId).order('due_date'),\n ])\n\n const order = orderRes.data\n if (!order) return null\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n\n // Collect unique payment_method_type_ids to resolve names in one query\n const typeIds = [...new Set((movRes.data ?? []).map((m: any) => m.payment_method_type_id).filter(Boolean))]\n let typeNames: Record<string, string> = {}\n if (typeIds.length > 0) {\n const { data: types } = await supabase.from('payment_method_types').select('id, name').in('id', typeIds)\n typeNames = Object.fromEntries((types ?? []).map((t: any) => [t.id, t.name]))\n }\n\n const movements = (movRes.data ?? []).map((m: Record<string, unknown>) => ({\n id: String(m.id),\n amount: Number(m.amount) || 0,\n paidAmount: Number(m.paid_amount) || 0,\n status: String(m.status ?? 'pending'),\n dueDate: String(m.due_date ?? ''),\n installmentNumber: m.installment_number != null ? Number(m.installment_number) : undefined,\n paymentDate: m.payment_date ? String(m.payment_date) : undefined,\n paymentMethodTypeName: m.payment_method_type_id ? typeNames[String(m.payment_method_type_id)] : undefined,\n cardBrand: m.card_brand ? String(m.card_brand) : undefined,\n cardInstallments: m.card_installments ? Number(m.card_installments) : undefined,\n }))\n\n return {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: movements.length > 0 ? computeStatus(movements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount: Number(meta.paidAmount) || 0,\n movements,\n }\n },\n\n async createInvoiceFromOrder(orderId: string, options?: {\n installments?: number\n dueDate?: string\n paymentMethodTypeId?: string\n }): Promise<string> {\n // Promote the existing order to an invoice_receivable atomically via the\n // shared DB function (ref + stage/direction + N installments, idempotent).\n // status='invoiced' is valid for appointment/service_order (CHECK).\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not available')\n const { error } = await supabase.rpc('fn_invoice_from_order', {\n p_order_id: orderId,\n p_due_date: options?.dueDate ?? null,\n p_status: 'invoiced',\n p_installments: options?.installments ?? 1,\n p_direction: 'credit',\n })\n if (error) throw new Error(error.message)\n return orderId\n },\n\n async payMovement(input) {\n await provider.payMovement({\n movementId: input.movementId,\n amount: input.amount,\n paymentDate: input.paymentDate,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n },\n\n async createCommissionMovement(orderId, options) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Order carries the assigned professional (assignee_id) and realized total.\n const { data: order } = await supabase\n .schema('saas_core')\n .from('orders')\n .select('id, tenant_id, assignee_id, total')\n .eq('id', orderId)\n .single()\n if (!order || !order.assignee_id) return null // no professional → no commission\n\n // Per-professional rate lives on staff_members, surfaced via v_staff (id = person id).\n const { data: staff } = await supabase\n .from('v_staff')\n .select('commission_rate')\n .eq('id', order.assignee_id)\n .single()\n\n const rate = Number(staff?.commission_rate) || 0\n const base = Number(order.total) || 0\n const amount = computeCommissionAmount(base, rate)\n if (amount <= 0) return null // nothing configured/realized to accrue\n\n // Idempotent: one commission accrual per order. Reuse if already present.\n const { data: existing } = await supabase\n .from('financial_movements')\n .select('id')\n .eq('invoice_id', orderId)\n .eq('movement_kind', 'commission')\n .limit(1)\n if (existing && existing.length > 0) return existing[0].id as string\n\n const dueDate = options?.dueDate ?? new Date().toISOString().slice(0, 10)\n\n const { data: inserted } = await supabase\n .from('financial_movements')\n .insert({\n tenant_id: order.tenant_id,\n invoice_id: orderId,\n direction: 'debit', // payable to the professional\n movement_kind: 'commission',\n amount,\n paid_amount: 0,\n status: 'pending',\n due_date: dueDate,\n metadata: {\n source: 'agenda',\n kind: 'commission',\n professionalId: order.assignee_id,\n commissionRate: rate,\n baseAmount: base,\n },\n })\n .select('id')\n .single()\n\n return (inserted?.id as string | undefined) ?? null\n },\n\n async checkout(orderId, input) {\n // 1. Create invoice (single installment, due today)\n const today = new Date().toISOString().slice(0, 10)\n const invoiceId = await this.createInvoiceFromOrder(orderId, { installments: 1, dueDate: today })\n\n // 2. Get the created movement\n const detail = await this.getPaymentDetail(invoiceId)\n if (!detail || detail.movements.length === 0) throw new Error('No movement created')\n\n const movement = detail.movements[0]\n\n // 3. Pay it in full\n await this.payMovement({\n movementId: movement.id,\n amount: movement.amount,\n paymentDate: today,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n\n // 4. Return updated detail\n return (await this.getPaymentDetail(invoiceId))!\n },\n\n async getPaymentMethodTypes() {\n const types = await provider.getPaymentMethodTypes()\n return types.map((t: any) => ({ id: t.id, name: t.name, transactionType: t.transactionType }))\n },\n\n async getBankAccounts() {\n const accounts = await provider.getBankAccounts()\n return accounts\n .filter((a: any) => a.isActive)\n .map((a: any) => ({ id: a.id, name: a.name, accountType: a.accountType }))\n },\n\n async getPaymentMethods(paymentMethodTypeId: string) {\n const methods = await provider.getPaymentMethods()\n return methods\n .filter((m: any) => m.paymentMethodTypeId === paymentMethodTypeId && m.isActive)\n .map((m: any) => ({ id: m.id, name: m.name }))\n },\n }\n}\n\nfunction mapInvoiceStatus(status: string): BookingPaymentStatus {\n switch (status) {\n case 'paid': return 'paid'\n case 'partial': return 'partial'\n case 'overdue': return 'overdue'\n case 'cancelled': return 'cancelled'\n case 'invoiced': return 'pending'\n case 'pending': return 'pending'\n case 'scheduled': return 'none'\n case 'confirmed': return 'none'\n case 'in_progress': return 'none'\n case 'completed': return 'none'\n case 'no_show': return 'none'\n case 'booked': return 'none'\n default: return 'pending'\n }\n}\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport type { AgendaPluginOptions } from './config'\nimport { resolveConfig } from './config'\nimport { AgendaPage } from './AgendaPage'\nimport { createSupabaseAgendaProvider } from './data/supabase'\nimport { createMockAgendaProvider } from './data/mock'\nimport { setAgendaTenantId } from './lib/tenant'\nimport { createAgendaStore } from './store'\nimport { agendaRegistries } from './registries'\nimport { AgendaGeneralSettings } from './components/AgendaGeneralSettings'\nimport { agendaLocales } from './locales'\nimport { setScheduleBlockConfig, getScheduleBlockConfig } from '@fayz-ai/saas'\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAgendaPlugin(options?: AgendaPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(agendaLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseAgendaProvider(),\n () => createMockAgendaProvider(),\n )\n const store = createAgendaStore(provider, options?.financialBridge)\n\n // Register schedule block config globally so ScheduleEditor can read it\n setScheduleBlockConfig({\n defaults: config.scheduleBlockDefaults,\n showServices: !!config.serviceLookup,\n showConcurrent: true,\n showBookingWindow: true,\n showLocations: config.modules.locationSelection,\n locations: config.locations.map((l) => ({ id: l.id, name: l.name })),\n // Lazy fetcher — called by ScheduleEditor when locations are needed but empty\n fetchLocations: config.modules.locationSelection && provider.getLocations\n ? async () => {\n const locations = await provider.getLocations!()\n const current = getScheduleBlockConfig()\n if (current) setScheduleBlockConfig({ ...current, locations })\n return locations\n }\n : undefined,\n })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(AgendaPage, { config, provider, store })\n\n return {\n id: 'agenda',\n name: config.labels.pageTitle,\n icon: 'Calendar',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'appointments', label: config.labels.pageTitle, group: config.labels.pageTitle },\n { id: 'agenda.schedules', label: 'Schedule Management', group: config.labels.pageTitle },\n ],\n\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/agenda',\n icon: 'Calendar',\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n routes: [\n {\n path: '/agenda',\n component: PageComponent,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n widgets: [],\n\n aiTools: [\n {\n id: 'agenda.list-appointments',\n name: 'listAppointments',\n description: 'Lists upcoming appointments for a given date or date range, optionally filtered by professional.',\n icon: 'Calendar',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\", \"this week\"' },\n professional: { type: 'string' as const, description: 'Professional name to filter by' },\n },\n },\n suggestions: [\n { label: \"What's on the agenda today?\" },\n { label: 'Show me tomorrow\\'s appointments' },\n { label: 'Who has the most bookings this week?' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n {\n id: 'agenda.create-appointment',\n name: 'createAppointment',\n description: 'Creates a new appointment for a client with a specific professional and service.',\n icon: 'CalendarPlus',\n mode: 'persist' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n client: { type: 'string' as const, description: 'Client name' },\n professional: { type: 'string' as const, description: 'Professional name' },\n service: { type: 'string' as const, description: 'Service name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD)' },\n time: { type: 'string' as const, description: 'Time (HH:MM)' },\n },\n required: ['client', 'professional', 'service', 'date', 'time'],\n },\n suggestions: [\n { label: 'Book a haircut for Sarah tomorrow at 10am' },\n ],\n permission: { feature: 'appointments', action: 'create' as const },\n },\n {\n id: 'agenda.check-availability',\n name: 'checkAvailability',\n description: 'Checks available time slots for a professional on a given date.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n professional: { type: 'string' as const, description: 'Professional name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\"' },\n duration: { type: 'number' as const, description: 'Required duration in minutes' },\n },\n required: ['professional', 'date'],\n },\n suggestions: [\n { label: 'When is Ana available tomorrow?' },\n { label: 'Find a 90-minute slot for Carlos this week' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n registries: agendaRegistries,\n\n settings: [\n {\n id: 'agenda',\n label: 'Agenda',\n icon: 'Calendar',\n component: (() => {\n const AgendaSettingsTab: React.FC = () => React.createElement(AgendaGeneralSettings)\n AgendaSettingsTab.displayName = 'AgendaSettingsTab'\n return AgendaSettingsTab as unknown as React.ComponentType<unknown>\n })(),\n order: 5,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n locales: agendaLocales,\n }\n}\n\n// Re-export types for consumers\nexport type { AgendaPluginOptions } from './config'\nexport type { ResolvedAgendaConfig } from './config'\nexport type { AgendaDataProvider } from './data/types'\nexport type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './financial-bridge'\nexport { createFinancialBridge, computeCommissionAmount } from './bridges/create-financial-bridge'\n"]}
|