@fayz-ai/plugin-agenda 0.27.11 → 0.27.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/AgendaGeneralSettings-YBI43RB6.js +96 -0
  2. package/dist/AgendaGeneralSettings-YBI43RB6.js.map +1 -0
  3. package/dist/AgendaMessageTemplates-46ZLTFLM.js +31 -0
  4. package/dist/AgendaMessageTemplates-46ZLTFLM.js.map +1 -0
  5. package/dist/AgendaPage-43OXQDZE.js +3174 -0
  6. package/dist/AgendaPage-43OXQDZE.js.map +1 -0
  7. package/dist/CheckinPage-SGWK2TQZ.js +904 -0
  8. package/dist/CheckinPage-SGWK2TQZ.js.map +1 -0
  9. package/dist/ConfirmationsView-DZJSYBXA.js +361 -0
  10. package/dist/ConfirmationsView-DZJSYBXA.js.map +1 -0
  11. package/dist/MyClientsTodayWidget-ZGTXJJKN.js +127 -0
  12. package/dist/MyClientsTodayWidget-ZGTXJJKN.js.map +1 -0
  13. package/dist/PersonAttendanceBlock-PHZVHFQ4.js +105 -0
  14. package/dist/PersonAttendanceBlock-PHZVHFQ4.js.map +1 -0
  15. package/dist/PersonAttendancesWidget-3NTWBGCU.js +1278 -0
  16. package/dist/PersonAttendancesWidget-3NTWBGCU.js.map +1 -0
  17. package/dist/PersonServicesWidget-4RJGKX3K.js +80 -0
  18. package/dist/PersonServicesWidget-4RJGKX3K.js.map +1 -0
  19. package/dist/chunk-37INOUNW.js +20 -0
  20. package/dist/chunk-37INOUNW.js.map +1 -0
  21. package/dist/chunk-A2VD5DVN.js +12 -0
  22. package/dist/chunk-A2VD5DVN.js.map +1 -0
  23. package/dist/chunk-HGJI2JR6.js +169 -0
  24. package/dist/chunk-HGJI2JR6.js.map +1 -0
  25. package/dist/chunk-VFQPXKXP.js +11 -0
  26. package/dist/chunk-VFQPXKXP.js.map +1 -0
  27. package/dist/chunk-WNANVT4F.js +2386 -0
  28. package/dist/chunk-WNANVT4F.js.map +1 -0
  29. package/dist/chunk-X7PKHXT6.js +18 -0
  30. package/dist/chunk-X7PKHXT6.js.map +1 -0
  31. package/dist/chunk-XTNSK4RJ.js +12 -0
  32. package/dist/chunk-XTNSK4RJ.js.map +1 -0
  33. package/dist/components/PersonAttendanceBlock.d.ts.map +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2530 -19553
  36. package/dist/index.js.map +1 -1
  37. package/dist/migrations/integrations-google-calendar.browser.js +15 -0
  38. package/dist/migrations/integrations-google-calendar.browser.js.map +1 -0
  39. package/dist/migrations/integrations-google-calendar.js +1992 -0
  40. package/dist/migrations/integrations-google-calendar.js.map +1 -0
  41. package/dist/migrations/main.browser.js +29 -0
  42. package/dist/migrations/main.browser.js.map +1 -0
  43. package/dist/migrations/main.js +6440 -0
  44. package/dist/migrations/main.js.map +1 -0
  45. package/package.json +13 -7
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/FilterRail.tsx","../src/lib/professional-scope.ts","../src/lib/recurrence.ts","../src/components/BookingPaymentPanel.tsx","../src/components/StatusBadge.tsx","../src/components/ClientHistoryPanel.tsx","../src/components/BookingInterestsPanel.tsx","../src/components/BookingPrepaidPanel.tsx","../src/components/BookingRevisionPanel.tsx","../src/types.ts","../src/components/AppointmentModal.tsx"],"names":["formatCurrency","t","jsxs","jsx","Fragment","useTranslation","React","Button","X","Check","Plus","useState","useEffect","Input","createPortal","todayLocal","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ExternalLink","SearchCombobox"],"mappings":"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","file":"chunk-WNANVT4F.js","sourcesContent":["import React from 'react'\nimport { FilterSection, FilterCheckRow, FilterCheckList, Input } from '@fayz-ai/ui'\nimport type { StatusConfig } from '../types'\n\n// ---------------------------------------------------------------------------\n// The left rail's shared parts.\n//\n// Agenda and Check-in are neighbouring tabs over the same bookings, and each\n// had grown its own filter column: one said \"Agendado\", the other \"Agendada\";\n// one painted the checkbox in the status colour, the other a grey box with a\n// dot beside it. Two vocabularies for one thing makes switching tabs a\n// re-learning exercise.\n//\n// The rail's LOOK now lives in @fayz-ai/ui — Reservas is a third screen with\n// the same column, and a design that only exists inside plugin-agenda is a\n// design the neighbours copy by eye. What stays here is the agenda's own\n// plumbing: the professional picker's search.\n// ---------------------------------------------------------------------------\n\nexport { FilterSection, FilterCheckList }\n\n/**\n * The status filter. Nothing selected means everything — the boxes draw checked\n * when the list is empty, because that is what the screen is showing.\n *\n * The box itself carries the status colour, so the filter doubles as the legend\n * for the rows and badges beside it.\n */\nexport function StatusFilterList({\n statuses, selected, onToggle,\n}: {\n statuses: ReadonlyArray<StatusConfig>\n selected: readonly string[]\n onToggle: (value: string) => void\n}) {\n return (\n <>\n {statuses.map((st) => (\n <FilterCheckRow\n key={st.value}\n option={{ value: st.value, label: st.label, color: st.color }}\n checked={selected.length === 0 || selected.includes(st.value)}\n onToggle={() => onToggle(st.value)}\n />\n ))}\n </>\n )\n}\n\n/** The professional filter — same row, with the box in the app's primary\n * instead of a per-row colour, because an agenda has no colour of its own.\n *\n * A BUSCA NÃO É ENFEITE. Uma clínica tem seis agendas e rolar resolve; uma\n * rede de franquia tem centenas, e aí a lista deixa de ser um filtro e vira um\n * obstáculo — 739 caixinhas para achar a Paula. Acima de `maxRows` a caixa de\n * busca aparece e a lista passa a mostrar só o que casa, com a conta do que\n * ficou de fora para que \"não achei\" nunca seja confundido com \"não existe\". */\nexport function ProfessionalFilterList({\n names, selected, onToggle,\n search, onSearchChange, searchPlaceholder, maxRows = 40, footer,\n}: {\n /** `{ id, label }` — the agenda keys by id, the check-in queue by name. */\n names: ReadonlyArray<{ id: string; label: string }>\n selected: readonly string[]\n onToggle: (id: string) => void\n /** Presente ⇒ a busca é controlada por quem chama (e pode ir ao servidor). */\n search?: string\n onSearchChange?: (value: string) => void\n searchPlaceholder?: string\n /** Quantos nomes desenhar. Acima disto a busca é o caminho. */\n maxRows?: number\n /** Linha final de quem chama — \"buscando no servidor\", por exemplo. */\n footer?: React.ReactNode\n}) {\n const searchable = onSearchChange !== undefined && (names.length > maxRows || Boolean(search))\n const term = (search ?? '').trim().toLowerCase()\n // Filtrar aqui também quando quem chama já filtrou no servidor não custa nada\n // e evita o piscar entre a tecla e a resposta.\n const matches = term ? names.filter((n) => n.label.toLowerCase().includes(term)) : names\n const shown = matches.slice(0, maxRows)\n const hidden = matches.length - shown.length\n\n return (\n <>\n {searchable && (\n <div className=\"mb-1.5\">\n <Input\n type=\"search\"\n value={search ?? ''}\n onChange={(e) => onSearchChange?.(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"h-auto rounded-md border-border bg-background px-2 py-1 text-xs shadow-none focus:border-primary focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n )}\n {shown.map((item) => (\n <FilterCheckRow\n key={item.id}\n option={{ value: item.id, label: item.label }}\n checked={selected.length === 0 || selected.includes(item.id)}\n onToggle={() => onToggle(item.id)}\n />\n ))}\n {matches.length === 0 && (\n <p className=\"px-1 py-1 text-xs text-muted-foreground\">—</p>\n )}\n {hidden > 0 && (\n <p className=\"px-1 py-1 text-[11px] text-muted-foreground\">+{hidden}</p>\n )}\n {footer}\n </>\n )\n}\n","// ---------------------------------------------------------------------------\n// QUEM PODE ATENDER NESTE LOCAL.\n//\n// Regra do V1: o Local Operacional estreita a lista de Profissional, e trocar\n// o local para onde a pessoa não atende LIMPA o campo. Sem ela dá para marcar\n// em Treinamento alguém que só atende na Tijuca — e o erro só aparece no dia,\n// com a cliente na porta da unidade errada.\n//\n// Mora fora do formulário porque é a única parte disto que uma conta de UMA\n// unidade não consegue exercitar: lá o campo de local nem aparece (um campo\n// com uma opção é pergunta que já tem resposta), então a tela não prova a\n// regra e o teste prova.\n// ---------------------------------------------------------------------------\n\nexport interface ScopedPerson {\n id: string\n name: string\n /**\n * AS UNIDADES em que a pessoa atende — plural, e é isso que a regra errava.\n *\n * O tipo dizia `locationId: string | null`, uma unidade só, e o mapeador\n * gravava `null` em toda linha porque a fonte (`v_bookable_people.unit_ids`)\n * é um CONJUNTO: quem atende na Tijuca e no Leme está nas duas. Com todo\n * mundo em `null`, a regra abaixo lia \"sem unidade\" para o quadro inteiro e\n * nunca estreitava nada — o filtro existia e não filtrava.\n *\n * `null` continua querendo dizer A REDE INTEIRA, que é a semântica de\n * `public.scoped_resources` para pessoa: quem não foi amarrado a uma unidade\n * atende em qualquer uma.\n */\n unitIds?: string[] | null\n avatarUrl?: string | null\n}\n\n/** Esta pessoa atende nesta unidade? Sem unidades = a rede inteira. */\nconst atendeEm = (p: ScopedPerson, unitId: string): boolean =>\n !p.unitIds || p.unitIds.length === 0 || p.unitIds.includes(unitId)\n\n/**\n * A lista que o seletor mostra.\n *\n * Três regras, nesta ordem:\n *\n * sem local escolhido todo mundo — não há o que estreitar\n * sem unidade na ficha FICA. Ausência de unidade não é \"não atende aqui\";\n * 117 dos 299 agendáveis do Espaço Facial estão assim,\n * e sumir com eles trocaria um erro raro por uma lista\n * vazia.\n * já escolhido NUNCA sai, mesmo fora do local: o valor está gravado,\n * e ausência no seletor não pode virar ausência na tela.\n */\nexport function professionalsForLocation<T extends ScopedPerson>(\n people: T[],\n locationId: string | null | undefined,\n selectedId?: string | null,\n): T[] {\n const doLocal = locationId ? people.filter((p) => atendeEm(p, locationId)) : people\n if (!selectedId || doLocal.some((p) => p.id === selectedId)) return doLocal\n const escolhido = people.find((p) => p.id === selectedId)\n return escolhido ? [...doLocal, escolhido] : doLocal\n}\n\n/**\n * O campo de profissional deve se esvaziar ao trocar de local?\n *\n * Só quando a pessoa TEM unidade e ela é outra. Manter o nome ali afirmaria que\n * ela atende num lugar onde não está.\n */\nexport function shouldClearProfessional<T extends ScopedPerson>(\n people: T[],\n locationId: string | null | undefined,\n selectedId: string | null | undefined,\n): T | null {\n if (!locationId || !selectedId) return null\n const escolhido = people.find((p) => p.id === selectedId)\n if (!escolhido || atendeEm(escolhido, locationId)) return null\n return escolhido\n}\n","// ---------------------------------------------------------------------------\n// RECURRING APPOINTMENTS — the date arithmetic, as pure functions.\n//\n// Occurrences are MATERIALISED: every one of them is a real `appointments` row\n// sharing a `series_id`, and the rule is stored beside them. The week grid,\n// conflict detection, the check-in queue and the financial order all read rows;\n// a virtual series would force every one of them to learn how to expand a rule.\n//\n// This file is the part that will be wrong if anything is, so it holds no\n// React, no provider and no clock of its own: dates in, dates out.\n//\n// Local calendar days, not instants. A recurrence is a statement about DAYS\n// (\"every other Tuesday\"), and doing that arithmetic on UTC instants is how a\n// series booked at 21:00 in São Paulo lands on the wrong weekday.\n// ---------------------------------------------------------------------------\n\n/** How the rule steps. The seam for a custom RRULE editor is this union. */\nexport type RecurrenceFreq = 'daily' | 'weekly' | 'monthly_weekday'\n\n/** What the modal offers. `none` is the absence of a rule, not a rule. */\nexport type RecurrencePresetId = 'none' | 'daily' | 'weekly' | 'biweekly' | 'monthly'\n\n/** Which end condition the person picked. Exactly one of them applies. */\nexport type RecurrenceEndMode = 'until' | 'count'\n\nexport interface RecurrenceRule {\n freq: RecurrenceFreq\n /** Every N periods. 1 = every week; 2 = every other week. */\n interval: number\n /** Inclusive last day, `YYYY-MM-DD`. Mutually exclusive with `count`. */\n until?: string | null\n /** Total occurrences, counting the first. Mutually exclusive with `until`. */\n count?: number | null\n}\n\n/**\n * THE HORIZON IS CAPPED, and the caller is told when the cap bit.\n *\n * \"Daily until the end of 2030\" is a sentence someone will type, and it is\n * 1.500 real rows in `appointments` — written one by one from a browser tab\n * that may be closed halfway. Two ceilings, whichever comes first, and the\n * expansion REPORTS that it stopped short instead of quietly obeying.\n */\nexport const RECURRENCE_MAX_OCCURRENCES = 60\n// Two years. It exists to bound `daily` and a rule with no end condition at\n// all — NOT to clip a series somebody deliberately asked for, so it has to sit\n// past the longest run the occurrence ceiling allows for a weekly rule (60\n// weeks is 413 days). At 400 it was the horizon that cut a weekly series of 60\n// down to 58, which reads on screen as the count being ignored.\nexport const RECURRENCE_HORIZON_DAYS = 730\n\nexport interface RecurrenceExpansion {\n /** Local day keys, `YYYY-MM-DD`, first occurrence included, ascending. */\n dates: string[]\n /** A cap stopped the series before its own end condition did. */\n truncated: boolean\n}\n\n// --- day helpers -----------------------------------------------------------\n//\n// UTC midnight and TEXT comparison, the same two rules `lib/schedule-engine.ts`\n// follows: `YYYY-MM-DD` sorts correctly as a string, and arithmetic done in UTC\n// has no daylight-saving hour to fall into.\n\nfunction parseDay(key: string): Date {\n const [y, m, d] = key.slice(0, 10).split('-').map(Number)\n return new Date(Date.UTC(y!, (m ?? 1) - 1, d ?? 1))\n}\n\nfunction formatDay(date: Date): string {\n const y = date.getUTCFullYear()\n const m = String(date.getUTCMonth() + 1).padStart(2, '0')\n const d = String(date.getUTCDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n}\n\nfunction addDays(date: Date, days: number): Date {\n return new Date(date.getTime() + days * 86400000)\n}\n\n/** Which occurrence of its weekday the day is inside its month: 1..5. */\nexport function weekdayOrdinalInMonth(key: string): number {\n return Math.floor((parseDay(key).getUTCDate() - 1) / 7) + 1\n}\n\n/**\n * The nth `weekday` of a month, or null when that month has no nth one.\n *\n * Null is the honest answer and the caller SKIPS the month: a series on the\n * fifth Tuesday cannot land in a month with four, and sliding it to the fourth\n * would silently move an appointment somebody already told a client about.\n */\nfunction nthWeekdayOfMonth(year: number, month: number, weekday: number, nth: number): Date | null {\n const first = new Date(Date.UTC(year, month, 1))\n const offset = (weekday - first.getUTCDay() + 7) % 7\n const candidate = new Date(Date.UTC(year, month, 1 + offset + (nth - 1) * 7))\n if (candidate.getUTCMonth() !== ((month % 12) + 12) % 12) return null\n return candidate\n}\n\n// --- presets ---------------------------------------------------------------\n\n/** The preset, as the rule it means. `none` has no rule. */\nexport function ruleForPreset(preset: RecurrencePresetId): Pick<RecurrenceRule, 'freq' | 'interval'> | null {\n switch (preset) {\n case 'daily': return { freq: 'daily', interval: 1 }\n case 'weekly': return { freq: 'weekly', interval: 1 }\n case 'biweekly': return { freq: 'weekly', interval: 2 }\n case 'monthly': return { freq: 'monthly_weekday', interval: 1 }\n default: return null\n }\n}\n\n/**\n * A stored rule, back as the preset that describes it — so reopening a series\n * shows \"a cada 2 semanas\" and not a blank control.\n *\n * `none` when nothing here describes it, which is what a rule written by a\n * future custom editor will look like. The screen then says \"personalizado\"\n * instead of claiming the rule is one of these five.\n */\nexport function presetForRule(rule: Pick<RecurrenceRule, 'freq' | 'interval'> | null | undefined): RecurrencePresetId {\n if (!rule) return 'none'\n if (rule.freq === 'daily' && rule.interval === 1) return 'daily'\n if (rule.freq === 'weekly' && rule.interval === 1) return 'weekly'\n if (rule.freq === 'weekly' && rule.interval === 2) return 'biweekly'\n if (rule.freq === 'monthly_weekday' && rule.interval === 1) return 'monthly'\n return 'none'\n}\n\n// --- expansion -------------------------------------------------------------\n\n/**\n * The days this rule produces, starting ON `startDate`.\n *\n * The first occurrence is always the start day itself — it is the appointment\n * somebody is booking, and the rule only says what comes after it.\n */\nexport function expandRecurrence(startDate: string, rule: RecurrenceRule): RecurrenceExpansion {\n const interval = Math.max(1, Math.floor(rule.interval || 1))\n const hardCount = rule.count != null ? Math.max(1, Math.floor(rule.count)) : null\n const until = rule.until || null\n\n // No end condition at all is not a series anyone asked for — it is an open\n // loop. Fall back to the occurrence ceiling so the writer is always bounded.\n const maxCount = Math.min(hardCount ?? RECURRENCE_MAX_OCCURRENCES, RECURRENCE_MAX_OCCURRENCES)\n const horizon = formatDay(addDays(parseDay(startDate), RECURRENCE_HORIZON_DAYS))\n\n const dates: string[] = []\n let reachedEndCondition = false\n\n const push = (key: string): boolean => {\n if (until && key > until) { reachedEndCondition = true; return false }\n if (key > horizon) return false\n dates.push(key)\n if (hardCount != null && dates.length >= hardCount) { reachedEndCondition = true; return false }\n return dates.length < maxCount\n }\n\n // THE FIRST DAY IS NOT SUBJECT TO THE END CONDITION. It is the appointment\n // being booked; the rule only describes what comes after it. Running it\n // through `push` meant that an end date earlier than the start — a plausible\n // slip in a date picker — returned ZERO days, and the booking the person was\n // in the middle of making silently stopped existing.\n dates.push(startDate)\n if (hardCount === 1) return { dates, truncated: false }\n if (until && startDate >= until) return { dates, truncated: false }\n\n if (rule.freq === 'monthly_weekday') {\n const start = parseDay(startDate)\n const weekday = start.getUTCDay()\n const nth = weekdayOrdinalInMonth(startDate)\n let step = 1\n while (true) {\n const target = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + step * interval, 1))\n const day = nthWeekdayOfMonth(target.getUTCFullYear(), target.getUTCMonth(), weekday, nth)\n step += 1\n // No nth weekday this month: skip it, and the skip still costs a step —\n // the cap counts months looked at, so a hopeless rule cannot spin.\n if (!day) {\n if (step > RECURRENCE_MAX_OCCURRENCES * 2) return { dates, truncated: true }\n const probe = formatDay(target)\n if (until && probe > until) return { dates, truncated: false }\n if (probe > horizon) return { dates, truncated: !reachedEndCondition }\n continue\n }\n if (!push(formatDay(day))) return { dates, truncated: !reachedEndCondition }\n }\n }\n\n const stepDays = rule.freq === 'daily' ? interval : interval * 7\n let cursor = parseDay(startDate)\n while (true) {\n cursor = addDays(cursor, stepDays)\n if (!push(formatDay(cursor))) return { dates, truncated: !reachedEndCondition }\n }\n}\n\n// --- edit / delete scope ---------------------------------------------------\n\n/**\n * The two scopes this release ships, and they are the two Google puts first.\n *\n * \"Este e os seguintes\" is deliberately absent: it needs a split of the stored\n * rule (one rule becomes two, the old one gaining an end date) and nothing\n * below pretends to do that. Adding it later means a third member here and a\n * rule-split in the provider — not a different data model.\n */\nexport type SeriesScope = 'this' | 'series'\n\nexport type SeriesTarget =\n | { kind: 'single'; bookingId: string }\n | { kind: 'series'; seriesId: string; bookingId: string }\n\n/**\n * What the chosen scope actually points at.\n *\n * A booking with no `series_id` resolves to itself whatever the scope says: the\n * caller asking for 'series' on a loose appointment is a screen bug, and\n * inventing a series id to satisfy it would delete nothing or everything.\n */\nexport function resolveSeriesTarget(\n booking: { id: string; seriesId?: string | null },\n scope: SeriesScope,\n): SeriesTarget {\n if (scope === 'series' && booking.seriesId) {\n return { kind: 'series', seriesId: booking.seriesId, bookingId: booking.id }\n }\n return { kind: 'single', bookingId: booking.id }\n}\n\n/** The fields a series edit may carry. The DAY is not one of them. */\nexport interface SeriesPatch<T> {\n seriesId: string\n patch: T\n /** `HH:mm` local — what every occurrence's start time becomes. */\n timeOfDay: string\n}\n\n/**\n * Exactly what to call, so the caller is not left guessing whether a series\n * write already covered the occurrence it opened.\n *\n * Apply `series` FIRST and `single` second: the series write sets the time of\n * every day, and the single write is the one that may move this occurrence to\n * another day — it has to land last to win.\n */\nexport interface SeriesEditPlan<T> {\n /** For the occurrence that was opened. Null = the series patch covered it. */\n single: Partial<T> | null\n /** For every occurrence of the series. Null when the scope is 'this'. */\n series: SeriesPatch<Omit<T, 'startsAt' | 'endsAt'>> | null\n /**\n * The person moved the appointment to another DAY while asking for \"all\".\n * The move lands on this occurrence only, and the screen has to say so —\n * sending one date to a whole series would collapse it into that day.\n */\n dateStaysLocal: boolean\n}\n\nexport function planSeriesEdit<T extends { startsAt?: string; endsAt?: string }>(args: {\n booking: { id: string; seriesId?: string | null }\n scope: SeriesScope\n patch: T\n /** `HH:mm` local, the time the form now shows. */\n timeOfDay: string\n /** The form's day differs from the occurrence's own day. */\n dateChanged: boolean\n}): SeriesEditPlan<T> {\n const target = resolveSeriesTarget(args.booking, args.scope)\n if (target.kind === 'single') {\n return { single: args.patch, series: null, dateStaysLocal: false }\n }\n const { startsAt, endsAt, ...shared } = args.patch\n return {\n single: args.dateChanged ? ({ startsAt, endsAt } as Partial<T>) : null,\n series: { seriesId: target.seriesId, patch: shared as Omit<T, 'startsAt' | 'endsAt'>, timeOfDay: args.timeOfDay },\n dateStaysLocal: args.dateChanged,\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 '../context'\nimport { useTranslation, appHref } from '@fayz-ai/core'\nimport type { BookingPaymentDetail } from '../bridges/financial-bridge'\nimport { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\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 {/*\n Conta em aberto abre para EDITAR; paga ou cancelada abre em\n leitura — a mesma regra de `invoiceOpensForEditing` no financeiro.\n Repetida aqui de propósito: a agenda fala com o financeiro pela\n ponte, e importar um lib dele por causa de duas palavras criaria a\n dependência entre plugins que a ponte existe para não ter.\n */}\n <a\n href={appHref(detail.status === 'paid' || detail.status === 'cancelled'\n ? `/financial/receivables/detail/${detail.invoiceId}`\n : `/financial/receivables/${detail.invoiceId}/edit`)}\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={appHref('/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 variant=\"bare\" size=\"bare\"\n key={pt.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => handleSelectType(pt.id)}\n className={`flex flex-col items-center justify-start 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} onValueChange={setPaymentMethodId}>\n <SelectTrigger className=\"mt-1 bg-card px-2.5\"><SelectValue placeholder={t('agenda.payment.select')} /></SelectTrigger>\n <SelectContent>\n {filteredMethods.map((m) => <SelectItem key={m.id} value={m.id}>{m.name}</SelectItem>)}\n </SelectContent>\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} onValueChange={setCardBrand}>\n <SelectTrigger className=\"mt-1 bg-card px-2.5\"><SelectValue placeholder={t('agenda.payment.selectBrand')} /></SelectTrigger>\n <SelectContent>\n {['Visa', 'Mastercard', 'American Express', 'Elo', 'Hipercard', 'Diners Club'].map((b) => (\n <SelectItem key={b} value={b}>{b}</SelectItem>\n ))}\n </SelectContent>\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={String(cardInstallments)} onValueChange={(v) => setCardInstallments(Number(v))}>\n <SelectTrigger className=\"mt-1 bg-card px-2.5\"><SelectValue /></SelectTrigger>\n <SelectContent>\n {Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (\n <SelectItem key={n} value={String(n)}>{n}x {n > 1 ? formatCurrency(orderTotal / n) : ''}</SelectItem>\n ))}\n </SelectContent>\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} onValueChange={setSelectedBankId}>\n <SelectTrigger className=\"mt-1 bg-card px-2.5\"><SelectValue placeholder={t('agenda.payment.selectAccount')} /></SelectTrigger>\n <SelectContent>\n {bankAccounts.map((a) => (\n <SelectItem key={a.id} value={a.id}>{a.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n )}\n\n {/* Confirm button */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={handleCheckout}\n disabled={processing || !selectedTypeId}\n className=\"whitespace-normal 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-modal 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 variant=\"bare\" size=\"bare\" 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","import React from 'react'\nimport { DotBadge } from '@fayz-ai/ui'\nimport { useAgendaConfig } from '../context'\n\n/**\n * The pill itself is `DotBadge` in @fayz-ai/ui now — six plugins had drawn it\n * by hand and drifted on the tint and the padding. What stays here is the only\n * agenda-specific part: turning a status VALUE into a colour and a word, which\n * it does from the agenda's own configured status list.\n */\nexport function StatusBadge({ status }: { status: string }) {\n const config = useAgendaConfig()\n const statusConfig = config.statuses.find((s) => s.value === status)\n return <DotBadge label={statusConfig?.label ?? status} color={statusConfig?.color ?? '#6b7280'} />\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaConfig, useAgendaProvider } from '../context'\nimport { StatusBadge } from './StatusBadge'\nimport { BookingCard } from './BookingCard'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// O QUE ESTA PESSOA JÁ FEZ AQUI.\n//\n// É a terceira aba do agendamento no V1, e responde a pergunta que a recepção\n// faz antes de qualquer outra quando um nome conhecido aparece na tela: já\n// veio? com quem? o que fez? pagou? Sem ela, a resposta custa fechar o\n// agendamento, abrir a ficha do cliente, achar a lista e voltar.\n//\n// UM CARTÃO POR ATENDIMENTO, do mais recente para trás — data, status,\n// serviços, profissional e valor, que é o que o V1 mostra. O atendimento\n// ABERTO fica marcado, porque ele é o único da lista que ainda pode mudar.\n// ---------------------------------------------------------------------------\n\nexport function ClientHistoryPanel({ clientId, currentBookingId, formatCurrency }: {\n clientId: string\n currentBookingId?: string\n formatCurrency: (value: number) => string\n}) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const provider = useAgendaProvider()\n const [bookings, setBookings] = React.useState<CalendarBooking[] | null>(null)\n const [failed, setFailed] = React.useState(false)\n\n React.useEffect(() => {\n let alive = true\n if (!provider.getClientHistory) { setBookings([]); return }\n provider.getClientHistory(clientId, 20)\n .then((rows) => { if (alive) setBookings(rows) })\n // A história é contexto, não o trabalho: falhar aqui não pode derrubar o\n // agendamento que a pessoa veio salvar.\n .catch(() => { if (alive) { setBookings([]); setFailed(true) } })\n return () => { alive = false }\n }, [clientId, provider])\n\n // Esqueleto com a FORMA do cartão — \"Carregando…\" deixa a aba pular quando\n // os cartões chegam.\n if (bookings === null) {\n return (\n <div className=\"space-y-2 px-5 py-4\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"h-16 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n )\n }\n\n if (failed) {\n return <p className=\"px-5 py-8 text-center text-sm text-muted-foreground\">{t('agenda.history.failed')}</p>\n }\n\n if (bookings.length === 0) {\n return <p className=\"px-5 py-8 text-center text-sm text-muted-foreground\">{t('agenda.history.empty')}</p>\n }\n\n return (\n <div className=\"space-y-2 px-5 py-4\">\n {bookings.map((booking) => {\n const services = (booking.services ?? []).map((s) => s.name).filter(Boolean)\n const isCurrent = booking.id === currentBookingId\n return (\n /* O MESMO cartão da fila e das confirmações. O cliente não aparece:\n esta lista já está dentro da ficha dele, e repetir o nome em cada\n linha é ruído. O atendimento ABERTO fica marcado — é o único da\n lista que ainda pode mudar. */\n <BookingCard\n key={booking.id}\n booking={booking}\n hideClient\n showDate\n formatCurrency={formatCurrency}\n className={isCurrent ? 'border-primary/40 bg-primary/5' : ''}\n badge={config.capabilities.status ? <StatusBadge status={booking.status} /> : undefined}\n />\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport { Sparkles, X, Plus } from 'lucide-react'\nimport { Button, SearchCombobox, type ComboboxOption } from '@fayz-ai/ui'\nimport { useAgendaProvider } from '../context'\n\n// ---------------------------------------------------------------------------\n// O quadro \"Interesses\" do agendamento — o do V1, dentro do cartão da AVALIAÇÃO.\n//\n// Interesse é o que o cliente DISSE que quer, antes de virar venda: não soma ao\n// total do agendamento e vive no funil (plg_crm_deal_interests). O quadro só\n// aparece quando há um serviço service_kind='evaluation' selecionado — é na\n// avaliação que se pergunta \"o que te traz aqui?\".\n//\n// A lista para adicionar é o CATÁLOGO INTEIRO de serviços, não a agenda do\n// profissional: interesse é o que o cliente quer, não o que este profissional\n// executa.\n//\n// Quem grava é o SALVAR do agendamento (setBookingInterests), nunca o quadro:\n// remover um chip aqui só desvincula deste agendamento — a cesta do CRM fica\n// intacta para os próximos.\n// ---------------------------------------------------------------------------\n\nexport interface SelectedInterest {\n key: string\n /** Presente = já existe no funil; null = novo, nasce no CRM ao salvar. */\n interestId: string | null\n productId: string\n name: string\n}\n\ninterface CrmInterest extends SelectedInterest {\n interestId: string\n}\n\nexport function BookingInterestsPanel({ clientId, bookingId, value, onChange }: {\n clientId: string | null\n /** Edição: os já vinculados entram selecionados. Criação: TODOS os abertos\n * do cliente entram — a regra do V1: quem agenda pode remover depois. */\n bookingId?: string\n value: SelectedInterest[]\n onChange: (next: SelectedInterest[]) => void\n}) {\n const provider = useAgendaProvider()\n const [crmInterests, setCrmInterests] = React.useState<CrmInterest[]>([])\n const [term, setTerm] = React.useState('')\n const [options, setOptions] = React.useState<ComboboxOption[]>([])\n const initializedFor = React.useRef<string | null>(null)\n const onChangeRef = React.useRef(onChange)\n onChangeRef.current = onChange\n\n React.useEffect(() => {\n if (!clientId) {\n setCrmInterests([])\n initializedFor.current = null\n onChangeRef.current([])\n return\n }\n let vivo = true\n provider.getClientInterests?.(clientId, bookingId)\n .then((rows) => {\n if (!vivo) return\n const list: CrmInterest[] = rows.map((r) => ({\n key: `crm-${r.interestId}`, interestId: r.interestId, productId: r.productId, name: r.name,\n }))\n setCrmInterests(list)\n // Pré-vincula uma vez por cliente. Na criação entram todos; na edição,\n // só os que a ponte diz que este agendamento atende.\n if (initializedFor.current !== clientId) {\n initializedFor.current = clientId\n onChangeRef.current(bookingId\n ? rows.filter((r) => r.linked).map((r) => ({\n key: `crm-${r.interestId}`, interestId: r.interestId, productId: r.productId, name: r.name,\n }))\n : list)\n }\n })\n // Sem funil ao alcance (permissão, plugin ausente): o quadro segue vazio\n // e ainda deixa declarar interesse novo.\n .catch(() => { if (vivo) setCrmInterests([]) })\n return () => { vivo = false }\n }, [clientId, bookingId, provider])\n\n React.useEffect(() => {\n if (!term.trim()) { setOptions([]); return }\n const timer = setTimeout(() => {\n provider.searchServices?.(term)\n .then((rows) => setOptions(rows.map((r) => ({ id: r.id, label: r.name, price: r.price }))))\n .catch(() => setOptions([]))\n }, 250)\n return () => clearTimeout(timer)\n }, [term, provider])\n\n const remove = (key: string) => onChange(value.filter((i) => i.key !== key))\n\n const addBack = (i: CrmInterest) => {\n if (value.some((v) => v.key === i.key)) return\n onChange([...value, i])\n }\n\n const add = (opt: ComboboxOption) => {\n setTerm(''); setOptions([])\n if (value.some((v) => v.productId === opt.id)) return\n // Já existe no funil e foi removido daqui? Religa o existente em vez de\n // criar um segundo desejo pelo mesmo procedimento.\n const existing = crmInterests.find((c) => c.productId === opt.id)\n if (existing) { addBack(existing); return }\n onChange([...value, { key: `new-${opt.id}`, interestId: null, productId: opt.id, name: opt.label }])\n }\n\n const removedCrm = crmInterests.filter((c) => !value.some((i) => i.key === c.key))\n\n return (\n <div className=\"space-y-1.5 rounded-lg border border-primary/25 bg-primary/5 px-2.5 py-2\">\n <div className=\"flex items-center gap-1.5 text-xs font-medium text-primary\">\n <Sparkles className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n Interesses{value.length > 0 ? ` (${value.length})` : ''}\n </div>\n\n {value.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {value.map((i) => (\n <span key={i.key} className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs\">\n {i.name}\n {!i.interestId && <span className=\"text-[10px] font-medium text-primary\">novo</span>}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => remove(i.key)}\n aria-label={`Remover ${i.name} deste agendamento`}\n className=\"rounded-full p-0.5 hover:bg-muted-foreground/20\"\n >\n <X className=\"h-3 w-3\" aria-hidden />\n </Button>\n </span>\n ))}\n </div>\n )}\n\n {removedCrm.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">Fora deste agendamento:</span>\n {removedCrm.map((i) => (\n <span key={i.key} className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-xs opacity-70\">\n {i.name}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => addBack(i)}\n aria-label={`Vincular ${i.name} a este agendamento`}\n className=\"rounded-full p-0.5 hover:bg-muted-foreground/20\"\n >\n <Plus className=\"h-3 w-3\" aria-hidden />\n </Button>\n </span>\n ))}\n </div>\n )}\n\n <SearchCombobox\n value={term}\n onChange={setTerm}\n onSelect={add}\n options={options}\n placeholder=\"+ Interesse em serviço…\"\n onBlurEmpty={() => {}}\n minimal\n />\n </div>\n )\n}\n","import { Button } from '@fayz-ai/ui'\nimport React from 'react'\nimport { PackageCheck, Plus, Check } from 'lucide-react'\nimport { useAgendaProvider } from '../context'\n\ntype Item = { sessionId: string; serviceId: string; serviceName: string; durationMinutes: number }\n\n/**\n * V1's \"N serviço(s) pré-contratado(s) · N já agendado(s)\": what the client already bought and has\n * not had done, one click to put it in this booking. Shows nothing when there is nothing.\n */\nexport function BookingPrepaidPanel({ clientId, addedServiceIds, onAdd }: {\n clientId: string\n addedServiceIds: string[]\n onAdd: (item: Item) => void\n}) {\n const provider = useAgendaProvider()\n const [data, setData] = React.useState<{ open: Item[]; scheduledCount: number } | null>(null)\n\n React.useEffect(() => {\n let alive = true\n setData(null)\n provider.getPrepaidItems?.(clientId)\n .then((r) => { if (alive) setData(r) })\n .catch(() => { if (alive) setData({ open: [], scheduledCount: 0 }) })\n return () => { alive = false }\n }, [clientId, provider])\n\n if (!data || data.open.length === 0) return null\n\n // One row per service: three sessions of the same Botox read as \"3×\", not three lines.\n const grouped = new Map<string, { item: Item; count: number }>()\n for (const it of data.open) {\n const g = grouped.get(it.serviceId)\n if (g) g.count += 1\n else grouped.set(it.serviceId, { item: it, count: 1 })\n }\n\n return (\n <div className=\"space-y-1.5 rounded-lg border border-primary/25 bg-primary/5 px-2.5 py-2\">\n <div className=\"flex items-center gap-1.5 text-xs font-medium text-primary\">\n <PackageCheck className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n {data.open.length} serviço(s) pré-contratado(s)\n {data.scheduledCount > 0 && <span className=\"font-normal text-muted-foreground\">· {data.scheduledCount} já agendado(s)</span>}\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Já contratados e não executados — clique para adicionar a este atendimento.\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {[...grouped.values()].map(({ item, count }) => {\n const added = addedServiceIds.includes(item.serviceId)\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={item.serviceId}\n type=\"button\"\n disabled={added}\n onClick={() => onAdd(item)}\n className={`font-normal ${`inline-flex items-center gap-1 rounded-full border px-2.5 py-0.5 text-xs transition-colors ${\n added ? 'border-primary/40 bg-card text-muted-foreground' : 'border-transparent bg-card hover:border-primary/40'\n }`}`}\n >\n {added ? <Check className=\"h-3 w-3 text-primary\" aria-hidden /> : <Plus className=\"h-3 w-3\" aria-hidden />}\n {item.serviceName}{count > 1 ? ` ×${count}` : ''}\n </Button>\n )\n })}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Link2, Check } from 'lucide-react'\nimport { Button, Skeleton } from '@fayz-ai/ui'\nimport { useAgendaProvider } from '../context'\n\nexport interface RevisionChoice {\n sessionId: string\n revisionNumber: number\n serviceName: string | null\n}\n\ntype Candidate = {\n sessionId: string; serviceName: string | null; executedOn: string | null\n deadlineDays: number | null; daysSince: number | null; withinDeadline: boolean | null\n nextRevisionNumber: number\n}\n\n/** 'unavailable' = the pool has no candidates RPC; booking goes on and the ruler asks later. */\nexport type RevisionPanelState = 'loading' | 'empty' | 'ready' | 'unavailable'\n\nconst fmtDate = (iso: string | null) => (iso ? new Date(iso).toLocaleDateString('pt-BR') : '')\n\n/** V1's \"De qual serviço é esta revisão?\", inline in the booking (no dialog over the dialog). */\nexport function BookingRevisionPanel({ clientId, value, onChange, onState }: {\n clientId: string\n value: RevisionChoice | null\n onChange: (v: RevisionChoice | null) => void\n onState?: (s: RevisionPanelState) => void\n}) {\n const provider = useAgendaProvider()\n const [rows, setRows] = React.useState<Candidate[] | null>(null)\n const [state, setState] = React.useState<RevisionPanelState>('loading')\n\n React.useEffect(() => {\n let alive = true\n setRows(null); setState('loading')\n if (!provider.getRevisionCandidatesForPerson) { setState('unavailable'); return }\n provider.getRevisionCandidatesForPerson(clientId)\n .then((r) => { if (alive) { setRows(r); setState(r.length ? 'ready' : 'empty') } })\n .catch(() => { if (alive) { setRows([]); setState('unavailable') } })\n return () => { alive = false }\n }, [clientId, provider])\n\n React.useEffect(() => { onState?.(state) }, [state])\n\n if (state === 'unavailable') return null\n\n return (\n <div className=\"space-y-1.5 rounded-lg border border-primary/25 bg-primary/5 px-2.5 py-2\">\n <div className=\"flex items-center gap-1.5 text-xs font-medium text-primary\">\n <Link2 className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n De qual serviço é esta revisão?\n </div>\n\n {state === 'loading' && (\n <div className=\"space-y-1\">\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n </div>\n )}\n\n {state === 'empty' && (\n <p className=\"text-xs text-warning\">\n Este cliente não tem direito a revisão agora — não há serviço executado que possa receber\n revisão. Para atender, agende uma nova avaliação.\n </p>\n )}\n\n {state === 'ready' && rows && (\n <>\n <p className=\"text-[11px] text-muted-foreground\">\n A revisão só entra apontando para um serviço já executado. Sem esse vínculo o atendimento não finaliza.\n </p>\n <ul className=\"space-y-1\" role=\"radiogroup\" aria-label=\"Serviço revisado\">\n {rows.map((c) => {\n const on = value?.sessionId === c.sessionId\n return (\n <li key={c.sessionId}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n onClick={() => onChange(on ? null : {\n sessionId: c.sessionId, revisionNumber: c.nextRevisionNumber, serviceName: c.serviceName,\n })}\n className={`font-normal whitespace-normal justify-start ${`flex w-full items-center gap-2 rounded-md border px-2.5 py-1.5 text-left text-xs transition-colors ${\n on ? 'border-primary bg-card' : 'border-transparent bg-card/60 hover:bg-card'\n }`}`}\n >\n <span className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${on ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground/40'}`}>\n {on && <Check className=\"h-3 w-3\" aria-hidden />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium text-foreground\">{c.serviceName ?? 'Serviço'}</span>\n <span className=\"text-muted-foreground\">\n executado em {fmtDate(c.executedOn)}\n {c.deadlineDays != null && (c.withinDeadline\n ? ` · no prazo (${c.deadlineDays} dias)`\n : ` · fora do prazo de ${c.deadlineDays} dias`)}\n </span>\n </span>\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-foreground\">\n {c.nextRevisionNumber}ª Revisão\n </span>\n </Button>\n </li>\n )\n })}\n </ul>\n </>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\nimport { todayLocal } from '@fayz-ai/core'\n// Agenda Plugin — Pure TypeScript types\n// Zero dependencies. Maps to public archetype tables.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\n/** Booking status lifecycle */\nexport type BookingStatus =\n | 'scheduled'\n | 'confirmed'\n // The client is here and has not sat down yet. What check-in produces, and\n // the reception's most-used fact: who already arrived (agenda 003).\n | 'waiting'\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 /** Free-text event title (maps to the booking's display name). Used by\n * simple / Google-Calendar-style events that have no client party. */\n title?: boolean\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n /** Convidados — as OUTRAS pessoas na reunião, além do responsável.\n *\n * Opcional de propósito. Um salão, uma clínica e um restaurante não\n * declaram este campo, a linha não aparece, e nenhuma linha de convidado\n * chega a existir para eles. O comportamento continua idêntico ao de\n * antes — é esse o preço de entrada para mexer numa tabela da espinha. */\n attendees?: boolean\n }\n requiresServices: boolean\n requiresClient: boolean\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A booking service line item (from public.appointment_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/** Quem mais está na reunião (de public.appointment_attendees).\n *\n * Não confundir com `assigneeId`, que é UM profissional e continua sendo o\n * responsável — trocar o sentido dele quebraria a agenda de todo mundo.\n * Convidado é adição: a reunião tem um dono e N pessoas dentro. */\nexport interface BookingAttendee {\n id: string\n personId: string\n name: string\n /** `required` | `optional` — quem precisa estar e quem é bem-vindo. */\n role: string\n email: string | null\n avatarUrl: string | null\n}\n\n/** Calendar booking — the main entity rendered on the calendar (from v_appointments 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 /**\n * A SALA — `plg_agenda_resources`. Não confundir com `locationId`, que neste\n * SDK é a UNIDADE: a sala é onde dentro da unidade o atendimento acontece\n * (maca, cadeira, aparelho). 352.002 agendamentos do salão migrado já a\n * carregam; até agora nenhuma linha de TypeScript a lia.\n */\n resourceId?: string | null\n /** O NOME da sala, resolvido na leitura — sem ele a escolha fica invisível. */\n resourceName?: string | null\n /**\n * A SÉRIE de \"Repetir\" (`appointments.series_id`), quando esta ocorrência faz\n * parte de uma. Ausente/nulo = agendamento avulso.\n *\n * É o que faz a tela oferecer o escopo ao editar e ao excluir: sem ele,\n * \"excluir\" sobre uma de doze ocorrências não teria como perguntar se é esta\n * ou são todas.\n */\n seriesId?: 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 /** Convidados. Ausente (não vazio) quando a reserva não carrega nenhum. */\n attendees?: BookingAttendee[]\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 /** Quando a pessoa CHEGOU (005). `updatedAt` não serve: qualquer edição o reescreve. */\n checkedInAt?: string | null\n /** Payment status from financial bridge (enriched at runtime) */\n paymentStatus?: import('./bridges/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 /**\n * AS UNIDADES em que a pessoa atende. Vazio ou nulo = a rede inteira, que é a\n * semântica de `public.scoped_resources` para pessoa.\n *\n * Era `locationId: string | null` — uma unidade só — e o mapeador gravava\n * `null` em toda linha, porque a fonte (`v_bookable_people.unit_ids`) sempre\n * foi um CONJUNTO. O resultado é que o estreitamento por local, que existe e\n * tem teste, nunca teve dado para estreitar.\n */\n unitIds: string[] | null\n isActive: boolean\n}\n\n/**\n * O recorte da lista de agendas. Existe porque numa rede a lista NÃO cabe: o\n * quadro inteiro mora em `people`, e a agenda desenha uma coluna por linha que\n * volta. Sem `search` não há como achar um nome entre centenas; sem `limit` a\n * grade tenta desenhar todos.\n */\nexport interface ProfessionalQuery {\n /** Trecho do nome. */\n search?: string\n /** Sobrepõe a unidade ativa. Ausente = a unidade em que a tela está. */\n unitId?: string\n /** Teto de linhas. */\n limit?: number\n /**\n * Exatamente estas pessoas, sem teto.\n *\n * É como a agenda pede as COLUNAS depois de já saber quem tem grade ou\n * horário marcado no período — um conjunto pequeno e conhecido, ao contrário\n * da lista do seletor, que é o quadro inteiro e por isso vem cortada.\n */\n ids?: string[]\n}\n\n/**\n * O recorte das grades que a tela precisa.\n *\n * Uma grade ou é SEMANAL (`dayOfWeek`) ou é EXCEÇÃO de uma data\n * (`specificDate`). Pedir \"as segundas e as terças, mais o que for exceção\n * entre 21 e 27\" devolve exatamente o que a semana desenha.\n */\nexport interface ScheduleQuery {\n professionalId?: string\n /** Os dias da semana visíveis (0 = domingo). */\n daysOfWeek?: number[]\n /** O período visível, para as exceções. ISO `YYYY-MM-DD`. */\n from?: string\n to?: string\n}\n\n/** Working hours schedule (from public.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 /**\n * A VIGÊNCIA da grade — \"Início\" e \"Fim da vigência\" do V1.\n *\n * Chegavam do banco (o mapeador converte a linha inteira) e não estavam\n * declaradas aqui, então ninguém as lia: a agenda desenhava toda grade como\n * se valesse desde sempre e para sempre. Ponta vazia é ponta aberta.\n */\n validFrom?: string | null\n validTo?: string | null\n /**\n * `standard` ou `exception` — e a diferença não é rótulo: durante a vigência\n * de uma grade de exceção, cada weekday que ela define SUBSTITUI a padrão\n * naquele dia. Ver `lib/schedule-engine.ts`.\n */\n gridKind?: string | null\n /** 0 = toda semana; N = atende uma e pula N. */\n weekInterval?: number | null\n metadata: Record<string, unknown>\n}\n\n/**\n * Uma bola da régua do atendimento.\n *\n * `kind` é o vocabulário do schema (`form`, `evaluation`, `products`,\n * `invoice_item`, `revision_link`) e NÃO chega cru à tela — cada um tem nome de\n * balcão. `blocksStart` e `blocksFinish` são as duas travas do V1, e elas são\n * diferentes: a anamnese impede COMEÇAR, o termo de sessão impede TERMINAR.\n */\nexport interface AttendanceRequirement {\n id: string\n sessionId: string | null\n serviceId: string | null\n serviceName: string | null\n kind: string\n scope: string\n status: 'pending' | 'resolved' | 'not_applicable' | string\n /** O modelo de formulário que esta exigência pede, quando é um. */\n refId: string | null\n refName: string | null\n blocksStart: boolean\n blocksFinish: boolean\n /** \"Válido até\" — a anamnese vence, e é ela que solta o resto. */\n validUntil: string | null\n}\n\n/**\n * The RECORD of an attendance — what it WAS, not what it required.\n *\n * The ruler answers \"what is missing\"; this answers \"what happened\". Different\n * questions, and migrated history can only answer the second: of the 233,981\n * sessions brought over from V1, 1,338 bookings carry a stored requirement —\n * the rest opened an empty screen, because requirement circles were the only\n * thing that screen knew how to draw.\n */\nexport interface AttendanceRecord {\n sessionId: string\n serviceName: string | null\n status: string\n /** Who PERFORMED it — not who was booked. V1 keeps the two apart. */\n performedByName: string | null\n /**\n * A performer was recorded, even when the name does not come through.\n *\n * `people` carries a RESTRICTIVE reach policy (`people_available_in`): a\n * professional allocated to another unit cannot be named from this one.\n * Without this flag, \"no name\" and \"no performer\" render the same screen —\n * and the second is a false claim about the medical record.\n */\n hadPerformer: boolean\n /** Clinical notes: V1's free text, 176,975 of them in this tenant. */\n notes: string | null\n /** What this line cost, once it became an order item. */\n price: number | null\n /** Revision: the session this one revises. */\n revisionOf: string | null\n products: Array<{\n id: string\n name: string\n quantity: number | null\n unit: string | null\n /** Recipe standard — V1 shows \"Padrão: 1 SR\" beside it. */\n standard: number | null\n audited: boolean\n }>\n}\n\n/**\n * One service, summed across everything this person ever bought of it.\n *\n * V1 shows this as its own tab because it answers what a chronological list\n * cannot: the balance. \"Sculptra: 3 bought, 2 done, 1 left\" is a sentence the\n * front desk says every day, and it was nowhere on screen.\n */\nexport interface PersonServiceBalance {\n serviceId: string | null\n serviceName: string\n /** Sessions in any state — bought, scheduled, in service or done. */\n total: number\n executed: number\n /** Paid or contracted and still waiting for a day. V1 calls it *a executar*. */\n pending: number\n /** Revisions of this service (`parent_session_id`), counted apart. */\n revisions: number\n /** Most recent execution, ISO. Null when nothing was executed yet. */\n lastExecutedAt: string | null\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 = todayLocal()\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 /** A sala — ver `CalendarBooking.resourceId`. */\n resourceId?: string | null\n startsAt: string\n /** End chosen by hand (V1: Término is editable). Absent = start + services duration. */\n endsAt?: string\n /** The executed procedure a Revisão booking revises (V1 asks it on booking). */\n revisionOf?: { sessionId: string; revisionNumber: number; serviceName?: string | null }\n notes?: string\n /** Free-text event title for simple events (no client party). Maps to the\n * booking's display name (clientName in the read model). */\n title?: string\n /** O NEGÓCIO a que este compromisso pertence, quando ele nasce do CRM.\n *\n * Vai para `metadata.dealId` e não para uma coluna. `appointments` é tabela\n * da espinha, servida por toda vertical — uma clínica, um salão, um\n * restaurante. Uma chave estrangeira para `plg_crm_deals` ali dentro\n * amarraria o núcleo a um plugin, e as outras verticais passariam a\n * carregar uma coluna que nunca preenchem.\n *\n * O `metadata` já é o lugar onde cada origem escreve o que só ela entende\n * (`source`, `serviceNames`, `contactName`), e quem lê o vínculo é o CRM,\n * que sabe o que fazer com ele. */\n dealId?: string\n services: CreateBookingServiceInput[]\n /** Convidados. Omitido = nenhum, que é o caso de toda vertical que não usa. */\n attendees?: CreateBookingAttendeeInput[]\n}\n\nexport interface CreateBookingAttendeeInput {\n personId: string\n role?: string\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 resourceId?: string | null\n startsAt?: string\n endsAt?: string\n status?: BookingStatus\n notes?: string\n /** Free-text event title for simple events (no client party). */\n title?: string\n services?: CreateBookingServiceInput[]\n /** A lista INTEIRA de convidados. `undefined` não mexe em nada; `[]` esvazia.\n * A diferença importa: uma edição de horário não pode apagar os convidados\n * só porque o formulário não falou deles. */\n attendees?: CreateBookingAttendeeInput[]\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\n/**\n * A SALA TAMBÉM É FINITA.\n *\n * O conflito de horário só olhava o profissional. Com a sala escolhível, dois\n * atendimentos passam a poder ser mandados para a mesma maca no mesmo horário —\n * e numa clínica de três salas isso não é raro, é terça-feira. A colisão só\n * aparece quando as duas clientes estão na porta.\n *\n * Pergunta separada da do profissional, e não um booleano só, porque o aviso\n * precisa dizer QUAL das duas coisas está ocupada: \"a Natasha já tem\n * compromisso\" e \"a Sala 1 já está ocupada\" levam a decisões diferentes.\n */\nexport interface ResourceConflictParams {\n resourceId: 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, History, LogIn, DoorOpen, ExternalLink, Users } from 'lucide-react'\n\nconst BOOKING_TYPE_ICONS: Record<string, React.ElementType> = {\n Calendar, CheckSquare, Ban,\n}\nimport { Input, Textarea, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, toast, ModalTask, ModalTaskHost, ModalTaskHeader } from '@fayz-ai/ui'\nimport { SearchCombobox, type ComboboxOption } from '@fayz-ai/ui'\nimport { PersonPicker, type PersonOption } from '@fayz-ai/ui'\nimport { FORMS_ZONES } from '@fayz-ai/forms/views/zones'\nimport { FINANCIAL_ZONES } from '@fayz-ai/financial/views/zones'\nimport { professionalsForLocation, shouldClearProfessional } from '../lib/professional-scope'\nimport { Modal, ModalContent, ModalBody } from '@fayz-ai/ui'\nimport { DatePicker, SegmentedControl, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport {\n RECURRENCE_MAX_OCCURRENCES, expandRecurrence, planSeriesEdit, presetForRule, ruleForPreset,\n type RecurrenceEndMode, type RecurrencePresetId, type RecurrenceRule, type SeriesScope,\n} from '../lib/recurrence'\nimport type { SeriesConflictReport } from '../data/types'\nimport { ContactPicker, WidgetSlot } from '@fayz-ai/admin'\nimport { BookingPaymentPanel } from './BookingPaymentPanel'\nimport { ClientHistoryPanel } from './ClientHistoryPanel'\nimport { CrudDetailPage } from '@fayz-ai/admin'\nimport { CrudFormPage } from '@fayz-ai/admin'\nimport { useLimitGuard, invalidateLimit, useLookupCreate, useTenantPluginSettings } from '@fayz-ai/admin'\nimport { BookingInterestsPanel, type SelectedInterest } from './BookingInterestsPanel'\nimport { BookingPrepaidPanel } from './BookingPrepaidPanel'\nimport { BookingRevisionPanel, type RevisionChoice, type RevisionPanelState } from './BookingRevisionPanel'\nimport { Button } from '@fayz-ai/ui'\nimport { useAgendaConfig, useAgendaProvider, useAgendaStore } from '../context'\nimport { useTranslation, useActiveUnitId, resolveDataProvider, formatCurrency, navigateApp } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CreateBookingInput, BookingTypeId } from '../types'\nimport type { ExternalBookingSource } from '../config'\nimport { todayLocal } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Helpers\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\n// ---------------------------------------------------------------------------\n// A LINHA DO FORMULÁRIO.\n//\n// Toda linha deste modal é clicável — a data abre um seletor, o cliente abre a\n// busca, a observação abre o campo —, mas até aqui nada dizia isso: o alvo de\n// clique era o texto, e um texto sem moldura num formulário lê como etiqueta.\n// A faixa que acende no hover é o que o Google Calendar usa para a mesma frase,\n// e é o único sinal que funciona para linhas tão diferentes entre si quanto uma\n// data e uma lista de serviços.\n//\n// `-mx-2 px-2` para a faixa passar das bordas do texto sem desalinhar a coluna\n// de ícones. Uma constante e não doze cópias: hover de linha é uma decisão da\n// tela, e doze cópias é como onze delas ficam para trás.\n// `cursor-text` de volta nos campos: a mão é promessa de que o clique FAZ algo,\n// e sobre uma caixa onde já se digita ela promete a coisa errada.\nconst ROW = '-mx-2 flex cursor-pointer gap-3 rounded-lg px-2 transition-colors hover:bg-muted/40'\n + ' [&_input]:cursor-text [&_textarea]:cursor-text'\nconst ROW_CENTER = `${ROW} items-center`\nconst ROW_TOP = `${ROW} items-start`\n\ninterface ServiceItem { serviceId: string; name: string; durationMinutes: number; price: number }\ninterface CancellationReasonItem { id: string; label: string; requiresNotes?: boolean }\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 <div className={className}>\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=\"h-auto rounded-none border-0 border-b border-transparent bg-transparent p-0 text-right text-[11px] text-muted-foreground tabular-nums shadow-none hover:border-muted-foreground/40 focus:border-foreground focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\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 variant=\"bare\" size=\"bare\" ref={btnRef} type=\"button\" onClick={handleOpen}\n className=\"font-normal justify-start whitespace-normal 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 variant=\"bare\" size=\"bare\" key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`font-normal justify-start whitespace-normal flex w-full items-center gap-2.5 px-3 py-1.5 text-sm transition-colors ${\n !available ? 'disabled:pointer-events-auto disabled:cursor-not-allowed disabled:opacity-30' : 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\n// ---------------------------------------------------------------------------\n\n/**\n * Quem atende. Um `PersonPicker` na roupa `inline` — esta lista mora DENTRO da\n * faixa de hora do agendamento, ao lado de \"09:00 — 10:00\", e uma moldura de\n * campo ali dentro criaria uma segunda caixa dentro de uma linha que já é uma.\n *\n * O desenho em si (retrato à esquerda, nome inteiro, busca quando a lista\n * cresce) vem do primitivo, que é o mesmo do filtro da coluna e de toda outra\n * tela que pergunta \"quem\".\n */\nfunction ProfessionalSelect({ value, onChange, professionals }: {\n value: string; onChange: (v: string) => void\n professionals: Array<{ id: string; name: string; avatarUrl?: string | null }>\n}) {\n const t = useTranslation()\n const options: PersonOption[] = useMemo(\n () => professionals.map((p) => ({ id: p.id, name: p.name, avatarUrl: p.avatarUrl })),\n [professionals],\n )\n return (\n <PersonPicker\n variant=\"inline\"\n options={options}\n value={value}\n onChange={onChange}\n placeholder={t('agenda.appointment.selectProfessional')}\n searchPlaceholder={t('agenda.appointment.searchProfessional')}\n emptyLabel={t('agenda.appointment.noProfessional')}\n className=\"min-w-[11rem]\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Location Select — compact inline dropdown\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({ value, onChange, locations, placeholder }: {\n value: string; onChange: (v: string) => void\n locations: Array<{ id: string; name: string }>\n /** O que dizer quando nada foi escolhido. O seletor serve local E sala. */\n placeholder?: 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 variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"font-normal justify-start whitespace-normal 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\">{placeholder ?? 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 variant=\"bare\" size=\"bare\" key={l.id} type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`font-normal justify-start rounded-none whitespace-normal 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 externalSource?: ExternalBookingSource\n onClose: () => void\n onCreated?: (bookingId: string, source?: ExternalBookingSource) => void\n}\n\n/** A tradução do tipo, com o rótulo do app como resposta quando ela não existe. */\nfunction rotuloDoTipo(t: (k: string) => string, id: string, fallback: string): string {\n const chave = `agenda.bookingType.${id}`\n const traduzido = t(chave)\n return !traduzido || traduzido === chave ? fallback : traduzido\n}\n\nexport function AppointmentModal({ open, mode, bookingId, prefill, initialTab, externalSource, onClose, onCreated }: Props) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const config = useAgendaConfig()\n const provider = useAgendaProvider()\n const activeUnitId = useActiveUnitId()\n const initialSnapshot = useRef<string>('')\n const createBooking = useAgendaStore((s) => s.createBooking)\n const guardBookings = useLimitGuard('bookings_month')\n const updateBooking = useAgendaStore((s) => s.updateBooking)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const createBookingSeries = useAgendaStore((s) => s.createBookingSeries)\n const updateBookingSeries = useAgendaStore((s) => s.updateBookingSeries)\n const deleteBookingSeries = useAgendaStore((s) => s.deleteBookingSeries)\n const updateBookingStatus = useAgendaStore((s) => s.updateBookingStatus)\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 // A lista que a grade já carregou. Ver o efeito de edição abaixo.\n const loadedBookings = useAgendaStore((s) => s.bookings)\n\n // --- State ---\n // Default to the first configured booking type (e.g. 'event' in simple mode,\n // 'appointment' otherwise) so single-type agendas resolve their type cleanly.\n const defaultBookingType = (config.bookingTypes[0]?.id ?? 'appointment') as BookingTypeId\n const [loading, setLoading] = useState(mode === 'edit')\n const [bookingType, setBookingType] = useState<BookingTypeId>(prefill?.kind ?? defaultBookingType)\n const [title, setTitle] = useState('')\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 /**\n * A SALA. Não é a unidade — esta é `locationId`. É onde DENTRO da unidade o\n * atendimento acontece: maca, cadeira, aparelho. O salão migrado tem 160 e\n * 352.002 agendamentos já apontam para uma; a tela era o único lugar que não\n * sabia disso.\n */\n const [resourceId, setResourceId] = useState<string>((prefill as any)?.resourceId ?? '')\n const [services, setServices] = useState<ServiceItem[]>([])\n // Convidados. Só `personId` + `name`: o resto (e-mail, avatar) a leitura traz\n // e o formulário não precisa carregar para gravar.\n const [attendees, setAttendees] = useState<{ personId: string; name: string }[]>([])\n // Remonta o seletor depois de cada escolha, para ele voltar vazio e aceitar\n // o próximo nome. Sem isto o campo fica preso na última pessoa adicionada —\n // que é exatamente \"não consigo adicionar mais de um\".\n const [attendeeSeq, setAttendeeSeq] = useState(0)\n const [serviceSearch, setServiceSearch] = useState('')\n /** Os interesses do quadro do V1 — só gravam no Salvar (setBookingInterests). */\n const [interests, setInterests] = useState<SelectedInterest[]>([])\n const [serviceKinds, setServiceKinds] = useState<Record<string, string>>({})\n const [revisionChoice, setRevisionChoice] = useState<RevisionChoice | null>(null)\n const [revisionState, setRevisionState] = useState<RevisionPanelState>('loading')\n const [date, setDate] = useState(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return todayLocal()\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 /** Minutes set by editing Término; null = follows the services. V1 lets reception stretch a slot. */\n const [durationOverride, setDurationOverride] = useState<number | null>(null)\n const [editingEnd, setEditingEnd] = useState(false)\n // Typing \"11:00\" passes through \"01:00\", which is before the start; a controlled input would snap back.\n const [endDraft, setEndDraft] = useState<string | null>(null)\n /**\n * REPETIR — a série.\n *\n * O preset é a regra; a condição de fim é a outra metade dela. Nada aqui\n * expande datas: isso é `lib/recurrence.expandRecurrence`, que não conhece\n * React e por isso pode ter teste.\n */\n const [recurrencePreset, setRecurrencePreset] = useState<RecurrencePresetId>('none')\n const [recurrenceEndMode, setRecurrenceEndMode] = useState<RecurrenceEndMode>('count')\n const [recurrenceUntil, setRecurrenceUntil] = useState('')\n const [recurrenceCount, setRecurrenceCount] = useState(4)\n /** A série a que esta ocorrência pertence, na edição. */\n const [seriesId, setSeriesId] = useState<string | null>(null)\n const [seriesSize, setSeriesSize] = useState(0)\n const [seriesConflicts, setSeriesConflicts] = useState<SeriesConflictReport | null>(null)\n const [checkingSeries, setCheckingSeries] = useState(false)\n /** O escopo pedido antes de gravar ou excluir uma ocorrência de série. */\n const [scopeAsk, setScopeAsk] = useState<'save' | 'delete' | null>(null)\n /** Começa no MENOS destrutivo: quem quer mexer nas doze diz que quer. */\n const [scopeChoice, setScopeChoice] = useState<SeriesScope>('this')\n /** O dia em que a ocorrência ESTAVA — o que diz se a pessoa a moveu. */\n const initialDate = useRef<string>('')\n const [markingWaiting, setMarkingWaiting] = useState(false)\n /** O formulário pendente, aberto da própria faixa — ver CheckinDialog. */\n const [preenchendoForm, setPreenchendoForm] = useState<string | null>(null)\n /** Sobe a cada formulário gravado: a faixa de pendências relê. */\n const [formsVersao, setFormsVersao] = useState(0)\n\n /**\n * A lista do seletor, recortada pelo local — a regra do V1, em\n * `lib/professional-scope` porque é a única parte dela que uma conta de UMA\n * unidade não consegue exercitar na tela (lá o campo de local nem aparece).\n */\n const professionalOptions = React.useMemo(() => {\n const doLocal = professionalsForLocation(professionals, locationId, professionalId)\n if (!professionalId || doLocal.some((p) => p.id === professionalId)) return doLocal\n // Quem está gravado e não está nem no quadro: o nome vem do agendamento.\n const nome = loadedBookings.find((b) => b.id === bookingId)?.professionalName\n return [...doLocal, { id: professionalId, name: nome ?? '—', avatarUrl: null } as typeof professionals[number]]\n }, [professionals, professionalId, locationId, loadedBookings, bookingId])\n\n /**\n * Trocar o local para onde esta pessoa não atende LIMPA o campo. Manter o\n * nome ali afirmaria que ela atende num lugar onde não está — e o aviso diz o\n * que aconteceu, porque um campo que se esvazia sozinho lê como defeito.\n */\n React.useEffect(() => {\n const fora = shouldClearProfessional(professionals, locationId, professionalId)\n if (!fora) return\n setProfessionalId('')\n toast.info(`${fora.name} não atende neste local`)\n }, [locationId, professionalId, professionals])\n const [notes, setNotes] = useState('')\n const [showNotes, setShowNotes] = useState(false)\n const [saving, setSaving] = useState(false)\n const [conflict, setConflict] = useState(false)\n /** A SALA ocupada é outro aviso: leva a trocar de sala, não de horário. */\n const [roomConflict, setRoomConflict] = useState(false)\n // Client search/quick-create state now lives inside <ContactPicker>.\n const [serviceOptions, setServiceOptions] = useState<ComboboxOption[]>([])\n const [initialServiceOptions, setInitialServiceOptions] = useState<ComboboxOption[]>([])\n /**\n * O campo do QUANDO que está aberto — a data OU o horário, um de cada vez.\n *\n * Clicar na data abre a data; clicar na hora abre a hora. Houve aqui uma\n * tentativa de abrir o bloco INTEIRO em pastilhas no primeiro clique, e ela\n * custou dois defeitos: um ouvinte de clique-fora no documento que fechava o\n * bloco debaixo da escolha (tudo que este bloco abre é portalado para fora\n * dele, então escolher uma opção É clicar fora pelo DOM), e um salto de\n * layout que engolia o clique em Salvar. Um campo por vez não tem nenhum dos\n * dois: quem abre é o próprio campo, e quem fecha é ele.\n */\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('../bridges/financial-bridge').BookingPaymentStatus>('none')\n const [paymentStatusLoading, setPaymentStatusLoading] = useState(false)\n const [modalTab, setModalTab] = useState<'appointment' | 'client' | 'history' | 'financial'>('appointment')\n useEffect(() => { if (!clientId && modalTab !== 'appointment') setModalTab('appointment') }, [clientId, modalTab])\n const [clientData, setClientData] = useState<Record<string, any> | null>(null)\n const [clientDataLoading, setClientDataLoading] = useState(false)\n const [clientEditing, setClientEditing] = useState(false)\n const [cancellationReasons, setCancellationReasons] = useState<CancellationReasonItem[]>([])\n const [cancellationReasonId, setCancellationReasonId] = useState('')\n const [cancellationNotes, setCancellationNotes] = useState('')\n const [cancellationReasonsLoading, setCancellationReasonsLoading] = useState(false)\n\n /**\n * A ficha do cliente lê e grava pelo PROVIDER DA ENTIDADE, não por um update\n * cru em `people`. O provider do arquétipo é quem sabe o mapa: camelCase →\n * coluna, campo declarado em `customFields` → merge no jsonb (um update cru\n * de `social_name` quebra numa coluna que não existe, e escrever o jsonb\n * inteiro apagaria as chaves irmãs). É o mesmo caminho da tela de Cadastros.\n */\n const clientProvider = useMemo(\n () => (config.clientEntityDef ? resolveDataProvider(config.clientEntityDef as any) : null),\n [config.clientEntityDef],\n )\n\n const saveClientField = async (key: string, value: unknown) => {\n if (!clientProvider || !clientId) return\n await clientProvider.update(clientId, { [key]: value } as any)\n setClientData((cur) => (cur ? { ...cur, [key]: value } : cur))\n }\n\n // Active booking type config\n const activeType = config.bookingTypes.find((bt) => bt.id === bookingType) ?? config.bookingTypes[0]\n\n // What was asked for, not merely whether something is asked for. The dialog\n // covered the calendar, so \"opened\" and \"opened with a new slot\" were the\n // same event; beside the calendar you can pick a second slot while the first\n // is still on screen, and keying the reset on `open` alone would leave the\n // old date and time in a form the new click was supposed to have started.\n const requestKey = [\n mode, bookingId ?? '', initialTab ?? '',\n prefill?.startsAt ?? '', prefill?.endsAt ?? '',\n prefill?.professionalId ?? '', prefill?.locationId ?? '',\n prefill?.clientId ?? '', prefill?.kind ?? '',\n ].join('|')\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 ?? ''); setResourceId('')\n setServices([]); setAttendees([]); setDurationOverride(null); setRevisionChoice(null)\n setServiceSearch(''); setNotes(''); setStatus('scheduled'); setShowNotes(false)\n setConflict(false); setLoading(mode === 'edit')\n setBookingType(prefill?.kind ?? defaultBookingType); setTitle('')\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 setCancellationReasonId(''); setCancellationNotes(''); setCancellationReasonsLoading(false)\n setRecurrencePreset('none')\n setRecurrenceEndMode('count'); setRecurrenceUntil(''); setRecurrenceCount(4)\n setSeriesId(null); setSeriesSize(0); setSeriesConflicts(null); setCheckingSeries(false)\n setScopeAsk(null); setScopeChoice('this')\n initialDate.current = prefill?.startsAt ? prefill.startsAt.slice(0, 10) : todayLocal()\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 todayLocal()\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, requestKey])\n\n // Um lugar só não é uma escolha. Standing numa unidade, `getLocations`\n // devolve essa unidade e mais nada, e pedir um clique para confirmar o óbvio\n // é o campo cobrando atenção sem dar informação.\n //\n // Efeito próprio e não uma linha no reset: as unidades chegam por rede e\n // podem aterrissar DEPOIS do modal abrir. Só preenche o que está vazio, então\n // nunca passa por cima de uma escolha — da pessoa ou do prefill.\n useEffect(() => {\n if (!open || locationId) return\n const opts = storeLocations.length > 0 ? storeLocations : config.locations\n if (opts.length === 1) setLocationId(opts[0]!.id)\n }, [open, locationId, storeLocations, config.locations])\n\n /**\n * As SALAS, pedidas pelo próprio formulário.\n *\n * Direto no provider e não pelo store: a lista muda com a unidade ativa e é\n * lida por uma tela só. Pôr no store custaria uma chave de memória a mais\n * para responder a mesma pergunta — e uma memória a mais é uma memória que\n * pode ficar velha.\n */\n const [storeResources, setStoreResources] = useState<Array<{ id: string; name: string }>>([])\n useEffect(() => {\n if (!open || !provider.getResources) return\n // SEM BANDEIRA DE CANCELAMENTO. `provider` não é estável entre renders, e\n // com ele nas dependências o efeito reencadeia: cada rodada nova limpa a\n // anterior, e a resposta que chegava era descartada por um `cancelado` que\n // já valia. A consulta voltava com as duas salas — verificado na rede — e o\n // campo nunca aparecia. Aqui a última resposta simplesmente vence: a lista\n // de salas de uma unidade não tem corrida que faça diferença.\n provider.getResources()\n .then(setStoreResources)\n // Sem sala a tela continua servindo: o campo simplesmente não aparece.\n .catch(() => setStoreResources([]))\n }, [open, provider])\n\n // Edit: load existing\n //\n // A GRADE JÁ TEM ESTE AGENDAMENTO. Ele veio no `getBookings` da semana, com\n // cliente, profissional, local, serviços e situação de pagamento — é o mesmo\n // objeto que o popover acabou de desenhar. Buscá-lo de novo pelo id custava\n // QUATRO consultas (`v_appointments`, `appointments`, `appointment_items`,\n // `items`) a cada abertura, e outras quatro a cada reabertura, para montar\n // uma tela que já estava montada.\n //\n // Só vai ao banco quando ele NÃO está em memória: link direto, notificação,\n // agendamento de outro período. Aí a pergunta é legítima — e é a única vez\n // que o formulário mostra \"carregando\".\n useEffect(() => {\n if (!open || mode !== 'edit' || !bookingId) return\n const hydrate = (b: any) => {\n setBookingType((b.kind as BookingTypeId) ?? defaultBookingType)\n setTitle(b.clientName ?? '')\n setClientId(b.clientId ?? ''); setClientSearch(b.clientName ?? '')\n setProfessionalId(b.professionalId ?? ''); setLocationId(b.locationId ?? ''); setResourceId(b.resourceId ?? '')\n setDate(b.startsAt.slice(0, 10))\n initialDate.current = 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 // A SÉRIE, quando há uma. Sem ela a tela não pode perguntar o alcance —\n // e \"Excluir\" sobre uma de doze ocorrências decidiria por conta própria.\n const serie = (b.seriesId as string | null | undefined) ?? null\n setSeriesId(serie)\n if (serie) {\n Promise.resolve(provider.countSeriesOccurrences?.(serie)).then((n) => setSeriesSize(n ?? 0)).catch(() => setSeriesSize(0))\n provider.getRecurrence?.(serie)\n .then((regra) => { if (regra) setRecurrencePreset(presetForRule(regra)) })\n .catch(() => {})\n }\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 if (b.attendees) setAttendees(b.attendees.map((a: any) => ({ personId: a.personId, name: a.name })))\n const somaServicos = (b.services ?? []).reduce((acc: number, s: any) => acc + (s.durationMinutes ?? 0), 0)\n const gravada = b.endsAt ? Math.round((new Date(b.endsAt).getTime() - new Date(b.startsAt).getTime()) / 60000) : 0\n const override = somaServicos > 0 && gravada > 0 && gravada !== somaServicos ? gravada : null\n setDurationOverride(override)\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 title: b.clientName ?? '',\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 ?? '', cancellationReasonId: '', cancellationNotes: '', services: svcSnap, dur: override,\n // Sem isto, uma edição que SÓ acrescenta um convidado não conta como\n // alteração e o botão \"Atualizar\" fica desabilitado para sempre — o\n // mesmo defeito que os serviços tiveram e que fez a lista vazia travar\n // o formulário.\n attendees: (b.attendees ?? []).map((a: any) => a.personId).sort(),\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 }\n\n const cached = loadedBookings.find((b) => b.id === bookingId)\n if (cached) { hydrate(cached); return }\n\n setLoading(true)\n provider.getBookingById(bookingId)\n .then((b) => { if (b) hydrate(b); else setLoading(false) })\n .catch(() => setLoading(false))\n // Same key as the reset above: whenever that clears the form to `loading`,\n // this has to be the thing that fills it back in.\n //\n // `loadedBookings` fica FORA das dependências de propósito: ela muda a cada\n // recarga da semana, e reagir a isso reescreveria o formulário por baixo de\n // quem está digitando nele. Ela é lida uma vez, na abertura.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, requestKey])\n\n // Fetch client data when client tab is opened. Pelo provider da entidade\n // quando há um: a linha volta com as chaves da FICHA (camelCase, custom\n // fields içados do jsonb) — o lookup devolve a linha crua do banco, e a\n // ficha lia \"—\" em todo campo que não fosse coluna com o mesmo nome.\n useEffect(() => {\n if (modalTab !== 'client' || !clientId || clientData) return\n setClientDataLoading(true)\n const load = clientProvider\n ? clientProvider.list({ filters: { id: clientId }, pageSize: 1, countMode: 'none' } as any)\n .then((r: any) => r.data?.[0] ?? null)\n : config.contactLookup\n ? config.contactLookup.getById(clientId).then((result) => result?.data ?? null)\n : Promise.resolve(null)\n load.then((row) => {\n setClientData(row)\n setClientDataLoading(false)\n }).catch(() => setClientDataLoading(false))\n }, [modalTab, clientId])\n\n useEffect(() => {\n if (!open || status !== 'cancelled' || !config.cancellationDetails || cancellationReasons.length > 0) return\n setCancellationReasonsLoading(true)\n config.cancellationDetails.listReasons()\n .then((reasons) => setCancellationReasons(reasons))\n .catch(() => setCancellationReasons([]))\n .finally(() => setCancellationReasonsLoading(false))\n }, [open, status, config.cancellationDetails, cancellationReasons.length])\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 (client search now lives inside <ContactPicker>)\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 = durationOverride ?? (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 /**\n * A JANELA DA PERGUNTA TEM DE TER FUSO.\n *\n * `${date}T${startTime}:00` é hora local sem offset, e o PostgREST compara\n * isso com uma coluna `timestamptz` lendo o texto como UTC. No Brasil a\n * pergunta saía TRÊS HORAS fora: a checagem de conflito olhava outra faixa do\n * dia, e um horário de fato ocupado passava em silêncio. O `Salvar` ao lado\n * sempre fez a conversão certa (`new Date(...).toISOString()`) — quem não\n * fazia era só a checagem, e por isso o erro nunca apareceu no dado, só na\n * ausência do aviso.\n */\n const janela = useMemo(() => ({\n startsAt: new Date(`${date}T${startTime}:00`).toISOString(),\n endsAt: new Date(`${date}T${endTime}:00`).toISOString(),\n }), [date, startTime, endTime])\n\n // Conflict check\n useEffect(() => {\n if (!professionalId || totalDuration === 0) { setConflict(false); return }\n const timer = setTimeout(() => {\n provider.checkConflict({\n assigneeId: professionalId, ...janela, excludeBookingId: bookingId,\n }).then(setConflict).catch(() => setConflict(false))\n }, 300)\n return () => clearTimeout(timer)\n }, [professionalId, janela, bookingId, totalDuration])\n\n // -------------------------------------------------------------------------\n // REPETIR — a regra, as datas, e o que já ocupa cada uma delas\n // -------------------------------------------------------------------------\n\n /** A regra como os dois controles a descrevem. Null = não se repete. */\n const recurrenceRule = useMemo<RecurrenceRule | null>(() => {\n const base = ruleForPreset(recurrencePreset)\n if (!base) return null\n if (recurrenceEndMode === 'until') {\n // Sem data final escolhida não há regra: o expansor cairia no teto de 60\n // e a tela prometeria uma série que ninguém pediu.\n if (!recurrenceUntil) return null\n return { ...base, until: recurrenceUntil, count: null }\n }\n return { ...base, until: null, count: Math.max(1, Math.min(RECURRENCE_MAX_OCCURRENCES, recurrenceCount)) }\n }, [recurrencePreset, recurrenceEndMode, recurrenceUntil, recurrenceCount])\n\n const expansion = useMemo(\n () => (recurrenceRule ? expandRecurrence(date, recurrenceRule) : null),\n [date, recurrenceRule],\n )\n /** Só vale a pena falar de série quando ela tem mais de uma ocorrência. */\n const seriesDates = expansion && expansion.dates.length > 1 ? expansion.dates : null\n\n /**\n * AS DATAS EM CONFLITO, ANTES DE CONFIRMAR.\n *\n * A série é criada mesmo assim — ver `createsAnyway` no dicionário, e o\n * mesmo \"avisa, não impede\" que o conflito de uma ocorrência já segue. O que\n * não pode é a ocorrência de 12/11 sumir em silêncio porque a Natasha já\n * tinha compromisso: a recepção prometeu doze datas ao telefone.\n */\n useEffect(() => {\n if (!open || !seriesDates || !professionalId || totalDuration === 0 || !provider.checkSeriesConflicts) {\n setSeriesConflicts(null); setCheckingSeries(false)\n return\n }\n setCheckingSeries(true)\n const timer = setTimeout(() => {\n const windows = seriesDates.map((dia) => {\n const inicio = new Date(`${dia}T${startTime}:00`)\n return {\n startsAt: inicio.toISOString(),\n endsAt: new Date(inicio.getTime() + totalDuration * 60000).toISOString(),\n }\n })\n provider.checkSeriesConflicts!({\n assigneeId: professionalId, windows, excludeBookingId: bookingId, unitId: activeUnitId,\n })\n .then(setSeriesConflicts)\n .catch(() => setSeriesConflicts(null))\n .finally(() => setCheckingSeries(false))\n }, 400)\n return () => { clearTimeout(timer); setCheckingSeries(false) }\n }, [open, seriesDates, professionalId, startTime, totalDuration, bookingId, activeUnitId, provider])\n\n /**\n * MARCAR NUM DIA QUE A CASA FECHA.\n *\n * O V1 separa feriado de data comemorativa justamente porque um deles \"afeta\n * agenda e funcionamento\" — e até agora esse eixo só virava etiqueta no\n * cabeçalho do calendário. Quem marca pelo telefone não está olhando o\n * calendário: digita a data, e ninguém diz que 25 é feriado.\n *\n * AVISA, NÃO IMPEDE. Casa aberta em feriado existe — e é justamente quando a\n * agenda enche. O que não pode é a recepção descobrir depois.\n */\n const [feriado, setFeriado] = React.useState<string | null>(null)\n useEffect(() => {\n if (!open || !date || !provider.getHolidays) { setFeriado(null); return }\n provider.getHolidays({ from: date, to: date }, activeUnitId)\n .then((rows) => {\n const fecha = rows.filter((h) => h.closes && h.date === date)\n setFeriado(fecha.length ? fecha.map((h) => h.name).join(' · ') : null)\n })\n .catch(() => setFeriado(null))\n }, [open, date, activeUnitId, provider])\n\n // O mesmo relógio, para a SALA. Duas perguntas e não uma: quem lê \"conflito\"\n // precisa saber se o ocupado é a pessoa ou a maca — uma se resolve mudando a\n // hora, a outra mudando de sala.\n useEffect(() => {\n if (!resourceId || totalDuration === 0 || !provider.checkResourceConflict) { setRoomConflict(false); return }\n const timer = setTimeout(() => {\n provider.checkResourceConflict!({\n resourceId, ...janela, excludeBookingId: bookingId,\n }).then(setRoomConflict).catch(() => setRoomConflict(false))\n }, 300)\n return () => clearTimeout(timer)\n }, [resourceId, janela, bookingId, totalDuration])\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 setDurationOverride(null)\n setServiceSearch(''); setServiceOptions([])\n }\n function removeService(idx: number) { setServices((p) => p.filter((_, i) => i !== idx)); setDurationOverride(null) }\n\n /** Término typed by hand: the duration follows it, never the other way round. */\n function changeEndTime(value: string) {\n if (!value) return\n const [sh, sm] = startTime.split(':').map(Number)\n const [eh, em] = value.split(':').map(Number)\n const minutes = eh * 60 + em - (sh * 60 + sm)\n if (minutes <= 0) return\n setDurationOverride(minutes === (serviceDuration > 0 ? serviceDuration : selectionDuration) ? null : minutes)\n }\n\n // A service that does not exist yet. A catalogue is never complete on the day\n // someone calls asking for what is missing from it, and leaving the booking to\n // register one loses the slot being booked. Inline rather than a dialog: this\n // already sits inside a form. Without `create` on the source, search only.\n const serviceCreate = useLookupCreate(\n config.serviceLookup,\n (created) => {\n const duration = (created.data?.duration_minutes as number) || 60\n setServices((p) => [...p, {\n serviceId: created.id,\n name: created.label,\n durationMinutes: duration,\n price: created.price ?? 0,\n }])\n setServiceSearch('')\n setServiceOptions([])\n },\n { variant: 'inline' },\n )\n\n /**\n * O QUADRO DE INTERESSES — a regra do V1, e um interruptor da casa.\n *\n * No V1 quem liga o quadro é o SERVIÇO: `service_kind='evaluation'` no\n * cadastro — não há setting. Aqui a casa ganha o interruptor\n * (`interestsOnBooking`, nas configurações da agenda) e o serviço continua\n * decidindo QUANDO: é na avaliação que se pergunta \"o que te traz aqui?\".\n */\n const agendaPrefs = useTenantPluginSettings('agenda', { interestsOnBooking: true, recurringBookings: true })\n /** \"Repetir\" é opcional por casa — ver AgendaGeneralSettings. */\n const recurrenceEnabled = agendaPrefs.get('recurringBookings')\n useEffect(() => {\n const ids = services.map((s) => s.serviceId).filter(Boolean)\n if (ids.length === 0 || !provider.getServiceKinds) { setServiceKinds({}); return }\n let vivo = true\n provider.getServiceKinds(ids)\n .then((m) => { if (vivo) setServiceKinds(m) })\n .catch(() => { if (vivo) setServiceKinds({}) })\n return () => { vivo = false }\n }, [services, provider])\n const showRevision = mode === 'create' && !!clientId\n && services.some((s) => serviceKinds[s.serviceId] === 'return')\n useEffect(() => { setRevisionChoice(null) }, [clientId])\n const showInterests = agendaPrefs.get('interestsOnBooking')\n && !!provider.getClientInterests && !!provider.setBookingInterests\n && !!clientId\n && services.some((s) => serviceKinds[s.serviceId] === 'evaluation')\n\n /**\n * Grava a lista final de interesses — DEPOIS do agendamento existir.\n * Falhar aqui não desfaz o agendamento (a regra do V1): avisa e segue.\n */\n async function persistInterests(id: string) {\n if (!showInterests) return\n try {\n const r = await provider.setBookingInterests!(id, interests.map((i) => ({ productId: i.productId })))\n if (!r.ok) throw new Error(r.reason)\n } catch {\n toast.error('Interesses não vinculados a este agendamento')\n }\n }\n\n /** O que o formulário diz, sem o dia e a hora — é o que viaja para a série. */\n function bookingPayload() {\n return {\n clientId,\n professionalId,\n locationId: locationId || undefined,\n resourceId: resourceId || null,\n notes: notes || undefined,\n title: activeType.fields.title ? title.trim() : undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })),\n ...(showRevision && revisionChoice ? { revisionOf: revisionChoice } : {}),\n attendees: activeType.fields.attendees ? attendees.map((a) => ({ personId: a.personId })) : undefined,\n }\n }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!canSubmit) return\n // Editar UMA ocorrência de uma série é ambíguo até alguém dizer o alcance,\n // e adivinhar \"só esta\" é tão errado quanto adivinhar \"todas\". Pergunta\n // primeiro; `commitSave` é quem grava.\n if (mode === 'edit' && seriesId && seriesSize > 1) { setScopeAsk('save'); return }\n await commitSave('this')\n }\n\n async function commitSave(scope: SeriesScope) {\n setScopeAsk(null)\n // Plan quantity guard (client-side, before the store call): opens the global\n // UpgradeModal and aborts when the monthly booking cap is reached. CREATE only.\n if (mode === 'create' && (await guardBookings()) === 'blocked') return\n setSaving(true)\n try {\n const startsAt = new Date(`${date}T${startTime}:00`).toISOString()\n const endsAt = durationOverride != null\n ? new Date(new Date(startsAt).getTime() + durationOverride * 60000).toISOString()\n : undefined\n if (mode === 'create') {\n const input = { kind: bookingType, startsAt, endsAt, ...bookingPayload() }\n // UMA série ou UM agendamento — a diferença é só quantas datas a regra\n // produziu. Uma \"série\" de uma ocorrência é um agendamento avulso, e\n // criá-la como série deixaria uma regra órfã no banco.\n const firstId = seriesDates && recurrenceRule\n ? (await createBookingSeries(input, recurrenceRule, seriesDates)).bookingIds[0]\n : (await createBooking(input)).id\n invalidateLimit('bookings_month')\n if (firstId) {\n await persistInterests(firstId)\n onClose()\n onCreated?.(firstId, externalSource)\n } else {\n onClose()\n }\n } else if (bookingId) {\n const plano = planSeriesEdit({\n booking: { id: bookingId, seriesId },\n scope,\n patch: { startsAt, ...(endsAt ? { endsAt } : {}), status: status as any, ...bookingPayload() },\n timeOfDay: startTime,\n dateChanged: date !== initialDate.current,\n })\n // A série primeiro: ela carimba o horário de todas as ocorrências, e a\n // escrita desta — que pode mudar o DIA — tem de ser a última a valer.\n if (plano.series) await updateBookingSeries(plano.series.seriesId, plano.series.patch as any, plano.series.timeOfDay)\n if (plano.single) await updateBooking(bookingId, plano.single as any)\n await persistInterests(bookingId)\n if (status === 'cancelled' && config.cancellationDetails && cancellationReasonId) {\n await config.cancellationDetails.saveCancellationDetails({\n bookingId,\n reasonId: cancellationReasonId,\n notes: cancellationNotes.trim() || undefined,\n cancelledAt: new Date().toISOString(),\n })\n }\n if (plano.dateStaysLocal) toast.info(t('agenda.recurrence.dateStaysLocal').replace('{{time}}', startTime))\n onClose()\n }\n } catch { /* toast */ }\n setSaving(false)\n }\n\n async function handleDelete() {\n if (!bookingId) return\n // Mesma pergunta do salvar, e pela mesma razão: apagar \"este\" e apagar \"os\n // doze\" são gestos diferentes atrás do mesmo botão.\n if (seriesId && seriesSize > 1) { setScopeAsk('delete'); return }\n await commitDelete('this')\n }\n\n async function commitDelete(scope: SeriesScope) {\n if (!bookingId) return\n setScopeAsk(null)\n setDeleting(true)\n try {\n if (scope === 'series' && seriesId) await deleteBookingSeries(seriesId)\n else await deleteBooking(bookingId)\n onClose()\n } catch {\n // deleteBooking surfaces its own toast. Return the footer to its normal\n // state (out of the confirm step) so a failure is clear feedback rather\n // than a modal that silently stays stuck on \"Confirm delete\".\n setConfirmingDelete(false)\n } finally {\n setDeleting(false)\n }\n }\n\n const isPaidBooking = editPaymentStatus === 'paid'\n const selectedCancellationReason = cancellationReasons.find((reason) => reason.id === cancellationReasonId)\n const needsCancellationReason = mode === 'edit' && status === 'cancelled' && !!config.cancellationDetails\n const needsCancellationNotes = needsCancellationReason && !!selectedCancellationReason?.requiresNotes\n\n // Dirty check — only enable Update when something changed\n const formSnapshot = useMemo(() =>\n JSON.stringify({ title, clientId, professionalId, locationId, resourceId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services: services.map((s: any) => ({ id: s.serviceId, dur: s.durationMinutes, price: s.price })), dur: durationOverride, attendees: attendees.map((a) => a.personId).sort() }),\n [title, clientId, professionalId, locationId, resourceId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services, durationOverride, attendees]\n )\n const isDirty = mode === 'create' || formSnapshot !== initialSnapshot.current\n\n const canSubmit = (\n (!activeType.fields.title || title.trim()) &&\n (!activeType.requiresClient || clientId) &&\n (!activeType.fields.professional || professionalId) &&\n (!activeType.requiresServices || services.length > 0) &&\n (!needsCancellationReason || !!cancellationReasonId) &&\n (!needsCancellationNotes || !!cancellationNotes.trim()) &&\n // V1: a Revisão only goes in pointing at an executed service.\n (!showRevision || revisionState === 'unavailable' || !!revisionChoice) &&\n !conflict && !saving\n )\n\n const showTabs = config.bookingTypes.length > 1\n\n // O cabeçalho do diálogo nomeia o agendamento, então o formulário não se\n // nomeia de novo.\n const modalTitle = mode === 'create'\n ? t('agenda.appointment.new')\n : (title.trim() || clientSearch || t('agenda.appointment.edit'))\n\n return (\n // MODAL POR CIMA DO CALENDÁRIO — a mesma moldura do card de negócio do CRM.\n //\n // A agenda é tela de TRABALHO EM LOTE: a recepção abre um cartão, corrige o\n // horário, fecha, abre o próximo — dezenas de vezes por manhã. O painel\n // vinha na coluna da direita, que é a coluna do assistente: duas coisas\n // diferentes entrando pela mesma borda, e o calendário espremido a cada\n // abertura. O modal deixa a semana montada atrás, intacta, e devolve a\n // largura para o formulário.\n //\n // `ModalContent` e não um overlay à mão: é ele que dá Esc, clique fora,\n // armadilha de foco e o PORTAL — sem o portal o diálogo herda a cor da\n // barra de onde foi aberto e sai quase-branco sobre cartão branco.\n <Modal open={open} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"3xl\" noPadding className=\"gap-0\" hideClose>\n {/* `overflow-hidden`, não `overflow-y-auto`: quem rola é o MIOLO de\n cada aba (o corpo do formulário, a ficha, a conta) — o rodapé com\n Salvar/Excluir e o \"Voltar ao agendamento\" ficam FIXOS embaixo.\n Com o body rolando o conjunto, o rodapé fugia com a rolagem. */}\n <ModalBody className=\"sm:max-h-[75vh] overflow-hidden p-0\">\n {/* Tarefas de camadas fundas (o \"Adicionar endereço\" da ficha, a\n fatura do Receber) tomam ESTA moldura em vez de abrir uma segunda\n janela — e o cabeçalho é UM só: o título vira breadcrumb\n (\"Damaris Alves › Recebimento\") e o X sai de cena enquanto a\n tarefa dura. Ver ModalTask/ModalTaskHeader. */}\n <ModalTaskHost\n className=\"flex min-h-0 flex-1 flex-col overflow-hidden\"\n header={(stack) => (\n <ModalTaskHeader title={modalTitle} stack={stack} onClose={onClose} />\n )}\n >\n\n {/* O FORMULÁRIO PENDENTE é uma tarefa como as outras: entra no\n breadcrumb, não por cima. Era uma segunda janela sobre o\n agendamento — a de trás visível e ilegível. */}\n {preenchendoForm && clientId && (\n <ModalTask\n open\n title=\"Formulário do cliente\"\n hint={clientSearch || undefined}\n onClose={() => setPreenchendoForm(null)}\n >\n <WidgetSlot\n zone={FORMS_ZONES.formFill}\n frame=\"inline\"\n templateId={preenchendoForm}\n personId={clientId}\n personName={clientSearch || undefined}\n onSaved={() => setFormsVersao((n) => n + 1)}\n onClose={() => setPreenchendoForm(null)}\n />\n </ModalTask>\n )}\n <>\n\n {/* ═══ TOP — type tabs + date/time ═══ */}\n <div className=\"px-5 pt-3 pb-3 shrink-0 space-y-3\">\n {/* Booking type tabs (create) or section tabs (edit) */}\n {/* Once the client is chosen on create, the record tabs take over (V1 opens the ficha from the\n booking; FAY-1613 asks for it right there). Without a client the kind tabs are still useful. */}\n {showTabs && mode === 'create' && !clientId ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {config.bookingTypes.map((bt) => {\n // `t()` devolve a PRÓPRIA CHAVE quando não conhece o termo, e\n // uma chave é sempre \"verdadeira\" — então `t(...) || bt.label`\n // nunca caía no fallback e a aba mostrava\n // `agenda.bookingType.meeting` na cara de quem abria.\n //\n // O dicionário do SDK não pode conhecer um tipo que o APP\n // declarou: `bookingTypes` existe justamente para o app\n // inventar os seus. Quando a tradução não existe, o rótulo que\n // ele escreveu é a resposta certa.\n const label = rotuloDoTipo(t, bt.id, bt.label)\n const isActive = bookingType === bt.id\n const BtIcon = BOOKING_TYPE_ICONS[bt.icon] ?? Calendar\n return (\n <Button variant=\"bare\" size=\"bare\" 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' || !!clientId) && (\n (config.clientEntityDef && clientId) || clientId || (config.modules.financial && editOrderId) ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {([\n { id: 'appointment' as const, label: rotuloDoTipo(t, bookingType, activeType.label), icon: Calendar, show: true },\n { id: 'client' as const, label: t('agenda.appointment.clientTab'), icon: User, show: !!config.clientEntityDef && !!clientId },\n // Entre a ficha e o dinheiro, como no V1: \"quem é\" → \"o que\n // já fez\" → \"o que deve\". Só com o provider sabendo contar.\n { id: 'history' as const, label: t('agenda.history.tab'), icon: History, show: !!clientId && !!provider.getClientHistory },\n // \"Financeiro\", como no V1 — e é a CONTA DO CLIENTE inteira,\n // não só a fatura deste agendamento; por isso basta o cliente.\n { id: 'financial' as const, label: t('agenda.appointment.financialTab'), icon: DollarSign, show: config.modules.financial && (!!clientId || !!editOrderId) },\n ]).filter((tab) => tab.show).map((tab) => {\n const isActive = modalTab === tab.id\n return (\n <Button variant=\"bare\" size=\"bare\" 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 {/* O INDICADOR DO V1, com as regras dele: quitado em\n verde; em aberto NO DIA do atendimento (e o status não\n é negativo) em VERMELHO — é a conta que a recepção tem\n de cobrar hoje; em aberto noutro dia, âmbar. Sem\n fatura num atendimento de hoje também é vermelho: a\n cobrança nem foi levantada. */}\n {tab.id === 'financial' && !paymentStatusLoading && (() => {\n const negativo = status === 'cancelled' || status === 'no_show'\n const hoje = date === todayLocal()\n if (editPaymentStatus === 'paid') {\n return <Check className=\"h-3.5 w-3.5 text-success\" aria-label=\"Quitado\" />\n }\n if (editPaymentStatus !== 'none' && editPaymentStatus !== 'cancelled') {\n return hoje && !negativo\n ? <AlertTriangle className=\"h-3.5 w-3.5 text-destructive\" aria-label=\"Pendente hoje\" />\n : <Clock className=\"h-3.5 w-3.5 text-warning\" aria-label=\"Em aberto\" />\n }\n if (editPaymentStatus === 'none' && hoje && !negativo && totalPrice > 0) {\n return <AlertTriangle className=\"h-3.5 w-3.5 text-destructive\" aria-label=\"Sem cobrança levantada\" />\n }\n return null\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 ) : null\n )}\n\n {/* Date/time + professional row — hidden on financial tab */}\n {modalTab === 'appointment' && (\n <>\n {/* O QUANDO, inteiro, num bloco só.\n Data, horário e repetição respondem à mesma pergunta, então\n dividem o relógio e a faixa — como no Google Calendar, onde\n \"Does not repeat\" é a segunda linha do bloco de horário e não\n um item à parte com ícone próprio. Separadas, as duas linhas\n liam como dois assuntos e a de baixo ganhava um ícone que não\n nomeia nada. */}\n <div className={`${ROW_TOP} py-1`}>\n <Clock className=\"mt-0.5 h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n {/* Wraps: the column is ~380px, so the assignee drops to its\n own line rather than squeezing the time out of the row. */}\n {/* A LINHA INTEIRA ABRE OS CAMPOS, e não só as duas palavras.\n Acertar \"sex., 2 de out.\" era mirar um alvo de 90px numa\n linha de 380; o resto da faixa acendia no hover e não fazia\n nada, que é a pior combinação possível. Clicar em qualquer\n vazio da linha abre data e horário juntos — é o que o Google\n mostra ao expandir o bloco.\n\n `closest` e não `stopPropagation` em cada filho: o seletor\n de profissional mora nesta mesma linha, e quem clica nele\n não está pedindo para editar a data. */}\n {/* A LINHA INTEIRA é o alvo, e cada campo também é o seu.\n Acertar \"sex., 2 de out.\" é mirar 90px numa linha de 380, e\n a faixa que acende no hover prometia o resto. Clicar em\n qualquer vazio abre data e hora juntas; clicar num dos dois\n abre aquele. Quem fecha é sempre o próprio campo, no blur —\n não há estado de bloco nem ouvinte global, que foi de onde\n saíram os dois defeitos anteriores.\n\n `closest` e não `stopPropagation` em cada filho: o seletor\n de profissional mora nesta mesma linha, e quem clica nele\n não está pedindo para editar a data. */}\n <div\n className=\"flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm min-w-0\"\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('button, input, select, [role=\"combobox\"]')) return\n setEditingDate(true); setEditingTime(true)\n }}\n >\n {editingDate ? (\n <div className=\"shrink-0\">\n <Input type=\"date\" value={date} autoFocus\n onChange={(e) => setDate(e.target.value)}\n onBlur={() => setEditingDate(false)}\n className=\"h-auto w-auto rounded-none border-0 border-b border-foreground bg-transparent p-0 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 font-medium\" />\n </div>\n ) : (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setEditingDate(true)}\n className=\"rounded-none shrink-0 border-b border-transparent px-0.5 py-0.5 font-medium transition-colors hover:border-foreground\">\n {formatCompactDate(date, locale)}\n </Button>\n )}\n {editingTime ? (\n <div className=\"shrink-0\">\n <Input type=\"time\" value={startTime} autoFocus={!editingDate}\n onChange={(e) => { if (e.target.value) setStartTime(e.target.value) }}\n onBlur={() => setEditingTime(false)}\n className=\"h-auto w-auto rounded-none border-0 border-b border-foreground bg-transparent p-0 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 text-xs text-muted-foreground\" />\n </div>\n ) : (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setEditingTime(true)}\n className=\"font-normal rounded-none shrink-0 border-b border-transparent px-0.5 py-0.5 text-xs text-muted-foreground transition-colors hover:border-foreground\">\n {startTime}\n </Button>\n )}\n <span className=\"text-[11px] text-muted-foreground/60\">—</span>\n {editingEnd ? (\n <div className=\"shrink-0\">\n <Input type=\"time\" value={endDraft ?? endTime} autoFocus aria-label={t('agenda.appointment.endTime')}\n onChange={(e) => { setEndDraft(e.target.value); changeEndTime(e.target.value) }}\n onBlur={() => { setEndDraft(null); setEditingEnd(false) }}\n className=\"h-auto w-auto rounded-none border-0 border-b border-foreground bg-transparent p-0 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 text-xs text-muted-foreground\" />\n </div>\n ) : (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setEditingEnd(true)} aria-label={t('agenda.appointment.endTime')}\n className=\"font-normal shrink-0 border-b border-transparent px-0.5 py-0.5 text-xs text-muted-foreground transition-colors hover:border-foreground\">\n {endTime}\n </Button>\n )}\n {totalDuration > 0 && (\n <span className=\"text-[11px] text-muted-foreground/60\">· {totalDuration} min</span>\n )}\n\n {/* Professional — right-aligned on the same row */}\n {activeType.fields.professional && (\n <div className=\"ml-auto shrink-0\">\n {/* A lista é o quadro AGENDÁVEL desta unidade; o\n agendamento em edição pode ter sido marcado com quem\n não está nele — a RLS de pessoa é por alcance de\n unidade, e um profissional de outra unidade não volta\n na consulta. Sem juntá-lo às opções, o seletor mostra\n \"Selecione profissional…\" sobre um agendamento que TEM\n profissional, e quem abrir para conferir outra coisa\n conclui que falta designar. */}\n <ProfessionalSelect value={professionalId} onChange={setProfessionalId} professionals={professionalOptions} />\n </div>\n )}\n </div>\n\n {/* ── REPETIR ─────────────────────────────────────────────────\n A SEGUNDA LINHA do bloco de horário: fechada ela é\n \"Não se repete\", e só abre as regras quando alguém clica.\n Fechada custa 11px, que é o preço certo para uma pergunta\n que a maioria não faz.\n\n Na CRIAÇÃO escolhe-se a regra; numa ocorrência que já existe\n a linha vira leitura. Trocar \"a cada 2 semanas\" por \"toda\n semana\" não é editar, é recriar a série — e um controle que\n parece editar e não edita é pior que nenhum. */}\n {provider.createRecurringBookings && recurrenceEnabled && (\n /* COLADA na linha de cima: as duas são a mesma frase, e um\n respiro entre elas as separa em dois assuntos de novo. */\n <div className=\"-mt-0.5\">\n {mode === 'edit' ? (\n <span className=\"text-xs text-muted-foreground\">\n {seriesId && seriesSize > 1\n ? t('agenda.recurrence.partOfSeries').replace('{{count}}', String(seriesSize))\n + (recurrencePreset !== 'none' ? ` · ${t(`agenda.recurrence.preset.${recurrencePreset}`)}` : '')\n : t('agenda.recurrence.preset.none')}\n </span>\n ) : (\n <>\n {/* A REGRA É SEMPRE UMA PASTILHA, e não um texto\n que vira pastilha. Ela já é o controle mais discreto\n da linha; dar-lhe um estado de \"fechada\" só criava\n um clique a mais antes de poder escolher. */}\n <div className=\"mt-1 flex flex-wrap items-center gap-2\">\n <Select value={recurrencePreset} onValueChange={(v) => setRecurrencePreset(v as RecurrencePresetId)}>\n <SelectTrigger className=\"h-auto w-auto gap-1 border-0 bg-transparent p-0 text-xs text-muted-foreground shadow-none transition-colors hover:text-foreground focus:ring-0\" aria-label={t('agenda.recurrence.label')}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">{t('agenda.recurrence.preset.none')}</SelectItem>\n <SelectItem value=\"daily\">{t('agenda.recurrence.preset.daily')}</SelectItem>\n <SelectItem value=\"weekly\">{t('agenda.recurrence.preset.weekly')}</SelectItem>\n <SelectItem value=\"biweekly\">{t('agenda.recurrence.preset.biweekly')}</SelectItem>\n <SelectItem value=\"monthly\">{t('agenda.recurrence.preset.monthly')}</SelectItem>\n </SelectContent>\n </Select>\n\n {recurrencePreset !== 'none' && (\n <>\n <Select value={recurrenceEndMode} onValueChange={(v) => setRecurrenceEndMode(v as RecurrenceEndMode)}>\n <SelectTrigger className=\"h-auto w-auto gap-1 border-0 bg-transparent p-0 text-xs text-muted-foreground shadow-none transition-colors hover:text-foreground focus:ring-0\" aria-label={t('agenda.recurrence.ends')}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"count\">{t('agenda.recurrence.endCountShort')}</SelectItem>\n <SelectItem value=\"until\">{t('agenda.recurrence.endUntilShort')}</SelectItem>\n </SelectContent>\n </Select>\n\n {recurrenceEndMode === 'count' ? (\n <>\n <div className=\"w-10 shrink-0\">\n <Input\n type=\"number\" min={1} max={RECURRENCE_MAX_OCCURRENCES}\n value={recurrenceCount}\n onChange={(e) => setRecurrenceCount(Number(e.target.value) || 1)}\n aria-label={t('agenda.recurrence.countLabel')}\n className=\"h-auto rounded-none border-0 border-b border-foreground bg-transparent p-0 text-center text-xs shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">{t('agenda.recurrence.times')}</span>\n </>\n ) : (\n <DatePicker value={recurrenceUntil} onChange={setRecurrenceUntil} />\n )}\n </>\n )}\n </div>\n\n {/* O QUE VAI ACONTECER, em texto miúdo sob a frase —\n nunca uma caixa. É consequência, não controle. */}\n {recurrencePreset !== 'none' && (\n <div className=\"mt-1.5 space-y-1\">\n {seriesDates && (\n <p className=\"text-[11px] text-muted-foreground\">\n {t('agenda.recurrence.summary')\n .replace('{{count}}', String(seriesDates.length))\n .replace('{{last}}', formatCompactDate(seriesDates[seriesDates.length - 1]!, locale))}\n </p>\n )}\n {expansion?.truncated && (\n <p className=\"text-[11px] text-warning\">\n {t('agenda.recurrence.capped').replace('{{max}}', String(RECURRENCE_MAX_OCCURRENCES))}\n </p>\n )}\n {!professionalId && seriesDates && (\n <p className=\"text-[11px] text-muted-foreground\">{t('agenda.recurrence.needsProfessional')}</p>\n )}\n {checkingSeries && (\n <p className=\"text-[11px] text-muted-foreground\">{t('agenda.recurrence.checking')}</p>\n )}\n {/* AVISA, NÃO IMPEDE — a mesma regra do conflito de\n uma ocorrência só. O que não pode é a data de\n 12/11 sumir calada porque a profissional já\n tinha compromisso: a recepção prometeu doze\n datas ao telefone. */}\n {!checkingSeries && seriesConflicts && seriesDates && (seriesConflicts.busyStarts.length > 0 || seriesConflicts.closedDates.length > 0) && (\n <div className=\"space-y-0.5 rounded-md bg-warning/10 px-2 py-1.5\">\n {seriesConflicts.busyStarts.length > 0 && (\n <p className=\"text-[11px] font-medium text-warning\">\n {t('agenda.recurrence.conflicts')\n .replace('{{busy}}', String(seriesConflicts.busyStarts.length))\n .replace('{{total}}', String(seriesDates.length))}\n </p>\n )}\n {seriesConflicts.closedDates.length > 0 && (\n <p className=\"text-[11px] font-medium text-warning\">\n {t('agenda.recurrence.closedDays').replace('{{closed}}', String(seriesConflicts.closedDates.length))}\n </p>\n )}\n <p className=\"text-[10px] text-muted-foreground\">{t('agenda.recurrence.createsAnyway')}</p>\n </div>\n )}\n </div>\n )}\n </>\n )}\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 {/* AVISA, NÃO IMPEDE. Duas pessoas na mesma sala às vezes é o\n certo — a segunda só faz a avaliação, ou a casa põe duas\n macas ali. Quem sabe disso é quem está marcando; travar o\n botão obrigaria a mentir a sala para salvar. */}\n {feriado && (\n <div className=\"flex items-center gap-2 rounded-lg bg-warning/10 px-3 py-1.5 text-xs text-warning-foreground\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n {t('agenda.appointment.holidayWarning')} {feriado}\n </div>\n )}\n {roomConflict && (\n <div className=\"flex items-center gap-2 rounded-lg bg-warning/10 px-3 py-1.5 text-xs text-warning-foreground\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n {t('agenda.appointment.roomConflict')}\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 if (!clientProvider) return\n await clientProvider.update(clientId, data as any)\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 // O lápis em cada campo, como na tela de Cadastros: corrigir\n // um telefone com a pessoa na frente não deve custar o modo\n // de edição inteiro.\n onFieldSave={clientProvider ? saveClientField : undefined}\n // A ficha completa mora numa PÁGINA (endereços, arquivos,\n // histórico); o modal mostra a fatia. O caminho vem do app\n // (clientRecordPath) — o plugin não sabe onde ela vive.\n extraActions={config.clientRecordPath ? [{\n id: 'full-record',\n label: t('agenda.appointment.fullRecord'),\n icon: ExternalLink,\n // `utility` fica AO LADO do Editar (ícone + tooltip);\n // secondary sumiria no caret.\n intent: 'utility' as const,\n onSelect: () => {\n navigateApp(`#${config.clientRecordPath}/${clientId}`)\n onClose()\n },\n }] : undefined}\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 === 'history' && clientId && (\n <div className=\"flex-1 overflow-y-auto\">\n <ClientHistoryPanel\n clientId={clientId}\n currentBookingId={bookingId}\n formatCurrency={(v) => formatCurrency(v, currency.code)}\n />\n </div>\n )}\n\n {/* A ABA FINANCEIRO É A CONTA DO CLIENTE INTEIRA — a regra do V1:\n \"Financeiro do agendamento = a conta do cliente, com a contratação\n deste atendimento fixada no topo\". A fatura deste agendamento\n entra destacada pelo orderId; Gerar Recebimento fecha o pedido\n pelo caminho único (chargeCheckout). Antes esta aba era só o\n pendente da invoice do agendamento — a visão parcial que o\n próprio V1 aposentou. */}\n {modalTab === 'financial' && clientId && (\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n <WidgetSlot\n zone={FINANCIAL_ZONES.clientAccountInline}\n personId={clientId}\n orderId={editOrderId}\n clientName={clientSearch || undefined}\n currency={currency}\n onGenerate={bookingId && provider.chargeCheckout ? async () => {\n // A recusa da RPC FALA. `chargeCheckout` devolve {ok, reason}\n // e jogar isso fora deixava o botão mudo — recusa silenciosa\n // e sucesso silencioso são a mesma tela.\n const r = await provider.chargeCheckout!(bookingId)\n if (!r.ok) {\n toast.error({\n not_found: 'Este agendamento não existe mais.',\n sem_sessao: 'Sessão expirada. Entre de novo para cobrar.',\n nada_contratado: 'Não há serviço contratado para cobrar neste agendamento.',\n }[r.reason ?? ''] ?? 'Não foi possível gerar o recebimento.')\n return\n }\n if (!r.total) {\n // Pedido de R$ 0,00 fecha sem levantar recebível — dizer\n // isso vale mais que uma tela que não muda.\n toast.success('Atendimento sem valor a cobrar — nada foi levantado.')\n }\n // O agendamento migrado do V1 pode ter ganhado o pedido\n // AGORA (a RPC o levanta quando não existe): recarrega o\n // booking para a conta destacar a fatura dele e o bloco\n // \"ainda não tem cobrança\" se recolher.\n let orderNow = editOrderId\n try {\n const fresh = await provider.getBookingById(bookingId)\n if (fresh?.orderId) { orderNow = fresh.orderId; setEditOrderId(fresh.orderId) }\n } catch { /* segue com o que tem */ }\n config.financialBridge?.getPaymentDetail(orderNow ?? '').then((d) => {\n if (d) { setEditPaymentStatus(d.status); setEditOrderTotal(d.totalAmount) }\n }).catch(() => {})\n if (agendaDateRange.start) fetchBookings(agendaDateRange)\n } : undefined}\n />\n </div>\n )}\n {/* Sem cliente (um evento avulso com pedido), o painel de cobrança\n do próprio pedido continua respondendo. */}\n {modalTab === 'financial' && !clientId && 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) => formatCurrency(v, 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 {/* Title — free-text event name (simple / Google-Calendar-style events) */}\n {activeType.fields.title && (\n <div className={`${ROW_CENTER} py-1`}>\n <Calendar className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n <Input type=\"text\" value={title} onChange={(e) => setTitle(e.target.value)}\n placeholder={t('agenda.appointment.addTitle')} autoFocus={mode === 'create'} aria-required\n className=\"px-2.5 font-medium\" />\n </div>\n </div>\n )}\n\n {/* Client */}\n {activeType.fields.client && (\n <div className={`${ROW_CENTER} py-1`}>\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {/* Shared find-or-create flow (@fayz-ai/admin), same component\n and same behaviour as the conversations composer.\n `variant=\"inline\"` only drops the chrome, to match this\n form's icon rows. Creating opens the app's own client\n form — see `createEntityDef`. */}\n <ContactPicker\n value={clientId || clientSearch ? { id: clientId || undefined, name: clientSearch, phone: clientPhone } : null}\n onChange={(contact) => {\n setClientId(contact?.id ?? '')\n setClientSearch(contact?.name ?? '')\n setClientPhone(contact?.phone ?? '')\n }}\n kind={config.clientKind}\n lookup={config.contactLookup}\n createEntityDef={config.clientEntityDef}\n clearable={!isPaidBooking}\n variant=\"inline\"\n placeholder={t('agenda.appointment.searchClient')}\n createLabel={t('agenda.appointment.newClient')}\n required={activeType.requiresClient}\n />\n </div>\n </div>\n )}\n\n {/* O que falta DESTE CLIENTE, assim que ele é escolhido.\n É onde o V1 avisa, e o momento certo: quem está marcando ainda\n tem a pessoa ao telefone. Depois, o aviso vira trabalho da\n recepção com ela já na porta. */}\n {activeType.fields.client && clientId && (\n <div className=\"pl-7\">\n <WidgetSlot zone={FORMS_ZONES.personChecklist} personId={clientId} version={formsVersao} onFill={(t: string) => setPreenchendoForm(t)} />\n {activeType.fields.services && (\n <div className=\"mt-2\">\n <BookingPrepaidPanel\n clientId={clientId}\n addedServiceIds={services.map((s) => s.serviceId)}\n // Price 0: it was paid when bought; the attendance start adopts that session (clinical 017).\n onAdd={(it) => {\n setServices((p) => [...p, { serviceId: it.serviceId, name: it.serviceName, durationMinutes: it.durationMinutes, price: 0 }])\n setDurationOverride(null)\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Convidados — as outras pessoas na reunião. Só aparece para os\n tipos que pedem (`fields.attendees`), então as verticais que\n não declaram o campo veem a mesma tela de sempre. */}\n {activeType.fields.attendees && (\n <div className={`${ROW_TOP} py-1`}>\n <Users className=\"h-4 w-4 mt-1.5 text-muted-foreground shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n {attendees.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mb-1.5\">\n {attendees.map((a) => (\n <span key={a.personId}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted/40 pl-2.5 pr-1 py-0.5 text-sm\">\n {a.name}\n <Button variant=\"bare\" size=\"bare\" type=\"button\" aria-label={t('agenda.attendees.remove')}\n onClick={() => setAttendees((p) => p.filter((x) => x.personId !== a.personId))}\n className=\"rounded-full p-0.5 hover:bg-muted transition-colors\">\n <X className=\"h-3 w-3\" />\n </Button>\n </span>\n ))}\n </div>\n )}\n <ContactPicker\n key={attendeeSeq}\n value={null}\n onChange={(contact) => {\n if (!contact?.id) return\n // O mesmo nome duas vezes na mesma reunião não quer dizer\n // nada, e a tabela recusa o par repetido de qualquer forma.\n setAttendees((p) => p.some((x) => x.personId === contact.id)\n ? p\n : [...p, { personId: contact.id!, name: contact.name ?? '' }])\n setAttendeeSeq((n) => n + 1)\n }}\n lookup={config.attendeeLookup}\n createEntityDef={config.clientEntityDef}\n variant=\"inline\"\n placeholder={t('agenda.attendees.add')}\n createLabel={t('agenda.appointment.newClient')}\n />\n </div>\n </div>\n )}\n\n {/* Location */}\n {/* From the grid the place is the schedule window's: asking again only invites a mismatch (FAY-1613). */}\n {activeType.fields.location && config.modules.locationSelection && (storeLocations.length > 0 || config.locations.length > 0)\n && !(mode === 'create' && prefill?.locationId && locationId === prefill.locationId) && (\n <div className={`${ROW_CENTER} 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 {/* Sala — depois do local, porque ela mora dentro dele. Só aparece\n quando a casa tem sala cadastrada: numa que atende em uma\n cadeira só, o campo seria uma pergunta com uma resposta. */}\n {storeResources.length > 0 && (\n <div className={`${ROW_CENTER} py-1`}>\n <DoorOpen className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <LocationSelect\n value={resourceId}\n onChange={setResourceId}\n locations={storeResources}\n placeholder={t('agenda.appointment.selectRoom')}\n />\n </div>\n )}\n\n {/* Services */}\n {activeType.fields.services && (\n <div className={`${ROW_TOP} 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 variant=\"bare\" size=\"bare\" 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 {serviceCreate.creating && serviceCreate.form}\n\n {!isPaidBooking && !serviceCreate.creating && <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 && formatCurrency(opt.price!, currency.code)}\n {hasPrice && dur > 0 && ' · '}\n {dur > 0 && `${dur}min`}\n </span>\n )\n }}\n minimal\n chevron\n required={activeType.requiresServices && services.length === 0}\n allowCreate={!!serviceCreate.onCreate}\n onCreateNew={serviceCreate.onCreate}\n createLabel={t('agenda.appointment.newService')}\n inlineLabel={services.length > 0 ? t('agenda.appointment.addService') : t('agenda.appointment.addServiceFirst')}\n inlineIcon={services.length > 0 ? 'plus' : 'search'}\n />}\n\n {/* O quadro do V1: a avaliação pergunta \"o que te traz aqui?\"\n e a resposta vai para o funil, não para a comanda. */}\n {showRevision && (\n <div className=\"mt-2\">\n <BookingRevisionPanel\n clientId={clientId}\n value={revisionChoice}\n onChange={setRevisionChoice}\n onState={setRevisionState}\n />\n </div>\n )}\n {showInterests && (\n <div className=\"mt-2\">\n <BookingInterestsPanel\n clientId={clientId || null}\n bookingId={mode === 'edit' ? bookingId : undefined}\n value={interests}\n onChange={setInterests}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Status */}\n {activeType.fields.status && (\n <div className={`${ROW_CENTER} 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 {needsCancellationReason && (\n <div className={`${ROW_TOP} py-1`}>\n <Ban className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <Select\n value={cancellationReasonId}\n onValueChange={setCancellationReasonId}\n disabled={cancellationReasonsLoading}\n >\n <SelectTrigger aria-required className=\"bg-card px-2.5\">\n <SelectValue placeholder={cancellationReasonsLoading ? t('agenda.cancellation.loadingReasons') : t('agenda.cancellation.selectReason')} />\n </SelectTrigger>\n <SelectContent>\n {cancellationReasons.map((reason) => (\n <SelectItem key={reason.id} value={reason.id}>\n {reason.label}{reason.requiresNotes ? ' *' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Textarea\n value={cancellationNotes}\n onChange={(event) => setCancellationNotes(event.target.value)}\n placeholder={needsCancellationNotes ? t('agenda.cancellation.notesRequired') : t('agenda.cancellation.notesOptional')}\n rows={2}\n aria-required={needsCancellationNotes || undefined}\n className=\"resize-none px-2.5 py-1.5\"\n />\n </div>\n </div>\n )}\n\n {/* Notes — progressive disclosure */}\n {!showNotes ? (\n <div className={`${ROW_CENTER} py-1`}>\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setShowNotes(true)}\n className=\"font-normal whitespace-normal 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={`${ROW_TOP} py-1`}>\n <FileText className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n <Textarea value={notes} onChange={(e) => setNotes(e.target.value)}\n placeholder={t('agenda.appointment.addDescription')} rows={2} autoFocus\n className=\"min-h-0 resize-none px-2.5 py-1.5\" />\n </div>\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 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 border-t fayz-glass-divider bg-transparent shrink-0\">\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 variant=\"bare\" size=\"bare\" 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 variant=\"bare\" size=\"bare\" 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 {formatCurrency(totalPrice, currency.code)} &middot; {t('agenda.payment.paid')}\n </Button>\n ) : date <= todayLocal() ? (\n <Button variant=\"bare\" size=\"bare\" 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 {formatCurrency(totalPrice, currency.code)} &middot; {t('agenda.payment.collect')}\n </Button>\n ) : (\n <span>&middot; {formatCurrency(totalPrice, currency.code)}</span>\n )\n ) : (\n <span>&middot; {formatCurrency(totalPrice, currency.code)}</span>\n )}\n </span>\n )}\n </div>\n {/* No Cancel button: the column's header already holds the\n way out, and at this width it crowded Save. */}\n <div className=\"flex items-center gap-2\">\n {/* CLIENTE AGUARDANDO — o check-in feito de dentro do\n agendamento, como no rodapé do V1.\n\n À DIREITA, com \"Atualizar\": este rodapé separa o que se\n LÊ do que se FAZ — à esquerda ficam o \"Excluir\" e os\n números do atendimento, à direita as ações. Receber a\n cliente é uma ação, e do lado esquerdo ela lia como mais\n um dado da linha.\n \n A recepção está com a cliente na frente e o agendamento\n aberto porque foi conferir alguma coisa; mandá-la fechar,\n ir até a fila e achar a mesma linha de novo é um caminho\n que só existe porque a tela não ofereceu o botão.\n\n Só aparece para o que é de HOJE e ainda é esperado:\n estado que impede não oferece a ação, e \"aguardando\" num\n agendamento de semana que vem não quer dizer nada. */}\n {mode === 'edit'\n && date === todayLocal()\n && (status === 'scheduled' || status === 'confirmed')\n && bookingId && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={markingWaiting}\n onClick={async () => {\n setMarkingWaiting(true)\n try {\n await updateBookingStatus(bookingId, 'waiting')\n setStatus('waiting')\n } finally { setMarkingWaiting(false) }\n }}\n className=\"inline-flex items-center gap-1.5 rounded-button border border-input px-2.5 py-1 text-xs font-medium transition-colors hover:bg-muted disabled:opacity-60\"\n >\n <LogIn className=\"h-3 w-3\" aria-hidden />\n {markingWaiting ? t('agenda.appointment.saving') : 'Cliente aguardando'}\n </Button>\n )}\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 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 border-t fayz-glass-divider bg-transparent shrink-0\">\n <div className=\"flex items-center\">\n <Button variant=\"bare\" size=\"bare\" 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 </>\n </ModalTaskHost>\n\n {/* O ALCANCE, perguntado uma vez, no gesto em que importa.\n Rádios e não dois botões: a escolha fica VISÍVEL antes de valer, e\n \"todos da série\" é destrutivo demais para morar num botão que já é\n o próprio gesto. Duas opções e não três — \"este e os seguintes\"\n precisa partir a regra guardada em duas, e nada aqui finge fazer\n isso. */}\n {scopeAsk && (\n <div className=\"absolute inset-0 z-20 flex items-end justify-center bg-background/70 p-4 sm:items-center\">\n <div className=\"w-full max-w-xs rounded-card border bg-card p-5 shadow-xl\">\n <p className=\"text-base font-semibold\">\n {scopeAsk === 'delete' ? t('agenda.recurrence.scopeDeleteTitle') : t('agenda.recurrence.scopeSaveTitle')}\n </p>\n <div className=\"mt-4 space-y-3\">\n {(['this', 'series'] as SeriesScope[]).map((op) => (\n <label key={op} className=\"flex cursor-pointer items-center gap-3 text-sm\">\n <input\n type=\"radio\" name=\"series-scope\" value={op}\n checked={scopeChoice === op}\n onChange={() => setScopeChoice(op)}\n className=\"h-4 w-4 accent-primary\"\n />\n {op === 'this'\n ? t('agenda.recurrence.scopeThis')\n : t('agenda.recurrence.scopeSeries').replace('{{count}}', String(seriesSize))}\n </label>\n ))}\n </div>\n <div className=\"mt-5 flex items-center justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setScopeAsk(null)}>\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"button\" size=\"sm\"\n onClick={() => { void (scopeAsk === 'delete' ? commitDelete(scopeChoice) : commitSave(scopeChoice)) }}>\n {t('common.confirm')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n"]}