@fayz-ai/plugin-agenda 0.27.11 → 0.27.13

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/AttendanceRuler.tsx","../src/components/PersonAttendancesWidget.tsx"],"names":["indicados","React","jsx","jsxs","Fragment","Button","formatCurrency","Check","CircleDashed"],"mappings":"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","file":"PersonAttendancesWidget-3NTWBGCU.js","sourcesContent":["import React from 'react'\nimport { Check, Clock, FileText, ClipboardCheck, Package, Receipt, Link2, CircleDashed, Mic, ArrowLeft, UserRound } from 'lucide-react'\nimport { Button, Checkbox, Input, ModalTask } from '@fayz-ai/ui'\nimport { formatCurrency } from '@fayz-ai/core'\nimport type { AttendanceRecord, AttendanceRequirement, CalendarBooking } from '../types'\nimport { useAgendaProvider } from '../context'\nimport { WidgetSlot } from '@fayz-ai/admin'\nimport { FORMS_ZONES } from '@fayz-ai/forms/views/zones'\nimport { useZoneFilled } from '../hooks/useZoneFilled'\nimport {\n ContractSignPane, FormFillDialog, ensureAttendanceContracts, listAttendanceContracts,\n type AttendanceContract, type ContractService, type FormFillResult, type RecommendationShortcut,\n} from '@fayz-ai/plugin-forms'\nimport { describeError } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// A RÉGUA DO ATENDIMENTO — as \"bolas\" do V1.\n//\n// O que ela responde, e que nenhuma outra tela responde: *o que falta antes de\n// executar este procedimento*. Sem ela o profissional guarda de cor — e a\n// clínica descobre a anamnese que faltou meses depois, quando alguém procura.\n//\n// TRÊS REGRAS QUE VÊM DO V1 E NÃO SÃO ENFEITE:\n//\n// · concluir uma etapa muda A COR, NÃO O LUGAR. A bola fica onde estava, e é\n// isso que deixa a pessoa decorar a régua em vez de reler a cada vez.\n// · o contador da linha do serviço é `resolvidas/totais` — e vem do BANCO.\n// Régua desenhada divergindo da gravada é o defeito que o V1 levou anos\n// para achar; aqui as duas leem a mesma tabela.\n// · a trava de COMEÇAR e a de TERMINAR são diferentes: a anamnese impede\n// sentar, o termo de sessão impede encerrar.\n//\n// E uma que é nossa: NENHUM VALOR DE BANCO CHEGA CRU À TELA. `invoice_item` e\n// `revision_link` são vocabulário de schema; o balcão lê \"Conta do atendimento\"\n// e \"Vínculo da revisão\".\n// ---------------------------------------------------------------------------\n\nconst KIND_LABEL: Record<string, string> = {\n form: 'Formulário',\n evaluation: 'Avaliação',\n products: 'Produtos utilizados',\n invoice_item: 'Conta do atendimento',\n revision_link: 'Vínculo da revisão',\n contract: 'Contrato',\n session_term: 'Termo de sessão',\n}\n\nconst KIND_ICON: Record<string, React.ComponentType<{ className?: string }>> = {\n form: FileText,\n evaluation: ClipboardCheck,\n products: Package,\n invoice_item: Receipt,\n revision_link: Link2,\n contract: FileText,\n session_term: FileText,\n}\n\n/** O que esta bola pede, dito como o balcão diz. */\nexport function requirementLabel(r: AttendanceRequirement): string {\n if (r.kind === 'form') return r.refName ?? KIND_LABEL.form\n if ((r.kind === 'contract' || r.kind === 'session_term') && r.refName) return r.refName\n return KIND_LABEL[r.kind] ?? r.kind\n}\n\n/** A contract drawn as a ruler step: pending until signed; blocks finishing when the template says so. */\nfunction contratoComoBola(c: AttendanceContract): AttendanceRequirement {\n return {\n id: `contract:${c.id}`, sessionId: null, serviceId: null, serviceName: null,\n kind: c.isSessionTerm ? 'session_term' : 'contract', scope: 'attendance',\n status: c.status === 'signed' ? 'resolved' : 'pending',\n refId: c.id, refName: c.templateName, blocksStart: false, blocksFinish: c.blocksFinish, validUntil: null,\n }\n}\n\nfunction Bola({ r, onClick }: { r: AttendanceRequirement; onClick?: () => void }) {\n const Icon = KIND_ICON[r.kind] ?? CircleDashed\n const done = r.status === 'resolved'\n const off = r.status === 'not_applicable'\n // A bola que TEM o que fazer vira botão; a que não tem continua sendo um\n // estado. Um círculo clicável que não leva a lugar nenhum ensina a não clicar.\n const Wrap: any = onClick ? 'button' : 'div'\n return (\n <Wrap\n type={onClick ? 'button' : undefined}\n onClick={onClick}\n className={`flex w-16 shrink-0 flex-col items-center gap-1 text-center ${onClick ? 'cursor-pointer' : ''}`}\n >\n <span\n className={`flex h-11 w-11 items-center justify-center rounded-full border ${\n done ? 'border-success bg-success/15 text-success'\n : off ? 'border-dashed border-border bg-muted/40 text-muted-foreground'\n : 'border-warning bg-warning/10 text-warning-foreground'\n }`}\n >\n {done ? <Check className=\"h-5 w-5\" aria-hidden /> : <Icon className=\"h-5 w-5\" aria-hidden />}\n </span>\n <span className=\"text-[10px] leading-tight text-muted-foreground\">{requirementLabel(r)}</span>\n </Wrap>\n )\n}\n\nconst RECUSA_CONTRATO: Record<string, string> = {\n sem_ficha_de_profissional: 'Este login não tem ficha de profissional.',\n nao_e_seu_atendimento: 'Este atendimento é de outro profissional.',\n atendimento_nao_esta_em_curso: 'O atendimento precisa estar em curso para contratar.',\n nada_marcado: 'Marque pelo menos um serviço.',\n}\n\nexport interface AttendanceRulerProps {\n booking: CalendarBooking\n open: boolean\n onClose: () => void\n /** Chamado depois de encerrar, para a fila relê o dia. */\n onFinished?: () => void\n /**\n * Onde a régua vive.\n *\n * `page` é a casa dela — o V1 abre o bloco ETAPAS DO ATENDIMENTO na FICHA do\n * cliente, e o atendimento é do profissional, não da recepção. `modal`\n * continua para quem a chama de uma fila sem sair dela.\n */\n frame?: 'modal' | 'page'\n}\n\n/**\n * Uma TAREFA dentro da moldura do atendimento.\n *\n * Não abre janela: ocupa o corpo do painel, com o nome do que se está fazendo\n * e uma seta que volta para as bolas. O rodapé da própria tarefa vem no\n * `children`, como já vinha — só deixou de flutuar sobre outra janela.\n */\nfunction TarefaPane({ titulo, aoVoltar, children }: {\n titulo: React.ReactNode\n aoVoltar: () => void\n children: React.ReactNode\n}) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-2 border-b px-5 py-3\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={aoVoltar}\n aria-label=\"Voltar para as etapas\"\n className=\"-ml-1 rounded-button p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden />\n </Button>\n <h2 className=\"min-w-0 truncate text-sm font-medium\">{titulo}</h2>\n </div>\n {children}\n </div>\n )\n}\n\nexport function AttendanceRuler({ booking, open, onClose, onFinished, frame = 'modal' }: AttendanceRulerProps) {\n const provider = useAgendaProvider()\n /** Muda quando algo é gravado: a régua relê sem a pessoa ter de recarregar. */\n const [versao, setVersao] = React.useState(0)\n\n /**\n * TRÊS ESTADOS, NÃO DOIS.\n *\n * A mesma régua abre do atendimento em curso (ferramenta), de um encerrado\n * (registro) e — o caso que faltava — de um agendamento que AINDA NÃO\n * COMEÇOU. Tratar \"não começou\" como \"encerrado\" fazia o rodapé mentir e\n * trancava todas as bolas de um atendimento que era só questão de iniciar.\n *\n * · em curso: tudo aberto.\n * · não iniciado: o rodapé oferece INICIAR (para o dono do agendamento — a\n * trava do V1); formulários já preenchem, porque no V1 a recepção resolve\n * a anamnese ANTES de começar (é a mesma faixa do check-in).\n * · encerrado: sem Executar/Finalizar — mas formulário pendente ainda abre:\n * o V1 chama isso de preenchimento tardio (`PendingAfterCloseCard`,\n * `execution_requirements_late_fill`) — \"havia 175 pendências em\n * atendimentos já encerrados que ninguém enxergava\".\n */\n const [statusLocal, setStatusLocal] = React.useState(booking.status)\n React.useEffect(() => { setStatusLocal(booking.status) }, [booking.id, booking.status])\n const emCurso = statusLocal === 'in_progress'\n const naoIniciado = statusLocal === 'scheduled' || statusLocal === 'confirmed' || statusLocal === 'waiting'\n const somenteLeitura = !emCurso\n /** Quem sou eu — a trava do V1: só o dono do agendamento inicia. */\n const [eu, setEu] = React.useState<string | null | undefined>(undefined)\n React.useEffect(() => {\n if (!naoIniciado) return\n let vivo = true\n ;(async () => {\n const p = (await provider.getCurrentPersonId?.()) ?? null\n if (vivo) setEu(p)\n })()\n return () => { vivo = false }\n }, [naoIniciado, provider])\n const [iniciando, setIniciando] = React.useState(false)\n const [recusaInicio, setRecusaInicio] = React.useState<string | null>(null)\n const [rows, setRows] = React.useState<AttendanceRequirement[] | null>(null)\n /** What the attendance WAS: notes, performer, products and price. */\n const [record, setRecord] = React.useState<AttendanceRecord[] | null>(null)\n const [erro, setErro] = React.useState<string | null>(null)\n /** O diálogo de contratação — \"O que o cliente deseja contratar?\" do V1. */\n const [contratando, setContratando] = React.useState(false)\n const [servicos, setServicos] = React.useState<Array<{\n id: string; serviceId: string; name: string; price: number; quantity: number\n fromInterest: boolean; fromIndication: boolean; alreadyContracted: boolean\n }>>([])\n const [marcados, setMarcados] = React.useState<Record<string, number>>({})\n const [salvando, setSalvando] = React.useState(false)\n /** A lista de serviços não executados que o V1 mostra ANTES de encerrar. */\n const [confirmando, setConfirmando] = React.useState<string[] | null>(null)\n const [encerrando, setEncerrando] = React.useState(false)\n const [avisoFinal, setAvisoFinal] = React.useState<string | null>(null)\n /** The attendance's contracts (V1 generated_contracts) and the one open to sign. */\n const [contratos, setContratos] = React.useState<AttendanceContract[]>([])\n const [assinando, setAssinando] = React.useState<AttendanceContract | null>(null)\n /** After contracting V1 walks Contrato → Termo → Executar; this holds the rest of that walk. */\n const filaAssinatura = React.useRef<{ ids: string[]; depois: (() => Promise<void>) | null }>({ ids: [], depois: null })\n /** O formulário que a bola abriu para preencher agora. */\n const [preenchendo, setPreenchendo] = React.useState<AttendanceRequirement | null>(null)\n const formsFillable = useZoneFilled(FORMS_ZONES.formFill)\n /** A avaliação aberta: o que o profissional está INDICANDO. */\n const [avaliando, setAvaliando] = React.useState(false)\n /** Os produtos usados, por serviço — o bloco do V1. */\n const [lancando, setLancando] = React.useState<{ serviceId: string; serviceName: string } | null>(null)\n /** \"Executar neste atendimento\" — o que couber hoje. */\n const [executando, setExecutando] = React.useState<Array<{ serviceId: string; name: string; feito: boolean }> | null>(null)\n /** A revisão esperando dizer o que revisa. */\n const [vinculando, setVinculando] = React.useState<AttendanceRequirement | null>(null)\n const [candidatos, setCandidatos] = React.useState<Array<{\n sessionId: string; serviceName: string | null; executedOn: string | null\n deadlineDays: number | null; daysSince: number | null; withinDeadline: boolean | null\n }> | null>(null)\n const [buscaInsumo, setBuscaInsumo] = React.useState('')\n const [insumos, setInsumos] = React.useState<Array<{ id: string; name: string }>>([])\n const [usados, setUsados] = React.useState<Array<{ productId: string; name: string; qtd: number; unitId: string | null }>>([])\n const [busca, setBusca] = React.useState('')\n const [catalogo, setCatalogo] = React.useState<Array<{ id: string; name: string; price: number }>>([])\n const [indicados, setIndicados] = React.useState<Array<{ id: string; name: string; price: number; qtd: number }>>([])\n\n React.useEffect(() => {\n if (!open) return\n let vivo = true\n ;(async () => {\n try {\n // Reapura ANTES de ler: quem acabou de preencher a anamnese veria a\n // régua de antes, e concluiria que o formulário não contou.\n //\n // IN PROGRESS ONLY. The ruler freezes on close and the refresh turns\n // into a no-op — but the no-op still costs a write per open, and\n // history is where opening happens: 233k attendances, leafed through\n // one after another. Reading the past writes nothing.\n if (emCurso) {\n try { await provider.refreshAttendanceRuler?.(booking.id) } catch { /* reading is better than not reading */ }\n }\n // Both reads at once: the ruler is what's missing, the record is what\n // happened. Waiting for the first before asking for the second makes\n // the screen flash twice in history, where the ruler is usually empty.\n // The session term is signed before executing: an attendance in progress with something to\n // execute gets it even when nothing was contracted here (prepaid, scheduled procedure).\n if (emCurso && booking.clientId) {\n try { await garantirContratos([]) } catch { /* the ruler still reads */ }\n }\n const [r, reg, cs] = await Promise.all([\n provider.getAttendanceRuler?.(booking.id),\n provider.getAttendanceRecord?.(booking.id).catch(() => []),\n listAttendanceContracts(booking.id).catch(() => [] as AttendanceContract[]),\n ])\n if (vivo) setContratos(cs)\n // A form that stopped applying (template switched off) is noise, not a step: a second\n // grey \"Anamnese\" next to the live one reads as a duplicate.\n if (vivo) {\n setRows([\n ...(r ?? []).filter((x) => !(x.kind === 'form' && x.status === 'not_applicable')),\n ...cs.map(contratoComoBola),\n ])\n setRecord(reg ?? []); setErro(null)\n }\n } catch (e) {\n if (vivo) setErro(describeError(e, 'Não foi possível ler a régua.'))\n }\n })()\n return () => { vivo = false }\n // `emCurso` belongs here: starting the attendance flips the state and the\n // ruler has to recompute right then — without it, whoever just pressed\n // Iniciar would read the empty ruler from before.\n }, [open, booking.id, versao, emCurso])\n\n // The revision chosen at booking (FAY-1613) links itself once the session exists; the pane\n // below stays for bookings made without the choice.\n const autoLinked = React.useRef(false)\n React.useEffect(() => {\n const escolhida = (booking.metadata as { revisionOf?: { sessionId?: string } } | undefined)?.revisionOf?.sessionId\n const pendente = rows?.find((r) => r.kind === 'revision_link' && r.status === 'pending' && r.sessionId)\n if (!emCurso || !escolhida || !pendente?.sessionId || autoLinked.current || !provider.linkRevision) return\n autoLinked.current = true\n provider.linkRevision(pendente.sessionId, escolhida)\n .then((r) => { if (r.ok) setVersao((v) => v + 1) })\n .catch(() => { /* the pending row keeps offering the manual link */ })\n }, [rows, emCurso, booking.metadata, provider])\n\n /**\n * Generates what this visit must sign. `contratados` empty = only the session term (the services\n * about to be executed here).\n */\n async function garantirContratos(contratados: ContractService[], indicados: ContractService[] = []) {\n if (!booking.clientId) return []\n const sess = (await provider.getAttendanceSessions?.(booking.id)) ?? []\n const daSessao = sess\n .filter((x) => x.serviceId && x.status !== 'executed' && x.status !== 'cancelled' && x.serviceKind !== 'evaluation')\n .map((x) => ({ serviceId: x.serviceId as string, name: x.serviceName ?? 'Serviço', quantity: 1, unitPrice: 0 }))\n return ensureAttendanceContracts({\n bookingId: booking.id,\n personId: booking.clientId,\n unitId: booking.locationId ?? null,\n professionalId: booking.professionalId ?? null,\n contracted: contratados,\n indicated: indicados,\n sessionServices: daSessao,\n })\n }\n\n /** Opens the next contract left to sign in the walk, or runs what comes after it. */\n async function proximaAssinatura(lista: AttendanceContract[]) {\n const fila = filaAssinatura.current\n while (fila.ids.length) {\n const c = lista.find((x) => x.id === fila.ids[0] && x.status === 'pending')\n fila.ids.shift()\n if (c) { setAssinando(c); return }\n }\n setAssinando(null)\n const depois = fila.depois\n fila.depois = null\n if (depois) await depois()\n }\n\n /**\n * Os serviços do agendamento — o que o V1 chama de INTERESSE quando ainda não\n * foi contratado. Vêm do `getBookingById`, que hidrata as linhas: a vista\n * plana do calendário não carrega item nenhum.\n */\n async function abrirContratacao() {\n const cands = (await provider.getContractCandidates?.(booking.id)) ?? []\n const itens = cands.map((c) => ({ id: c.serviceId, ...c }))\n setServicos(itens)\n // Marcado o que ainda não foi cobrado, na quantidade que veio da fusão: o\n // caso comum é contratar o que foi combinado, e desmarcar é mais rápido do\n // que marcar um a um. O que já virou conta aparece, mas desmarcado — some\n // seria mentir sobre o que foi combinado.\n setMarcados(Object.fromEntries(itens.map((i) => [i.serviceId, i.alreadyContracted ? 0 : i.quantity])))\n setContratando(true)\n }\n\n async function contratar() {\n const linhas = servicos\n .filter((sv) => sv.serviceId && (marcados[sv.serviceId] ?? 0) > 0)\n .map((sv) => ({ serviceId: sv.serviceId as string, name: sv.name, quantity: marcados[sv.serviceId as string], unitPrice: sv.price }))\n if (!linhas.length) return\n setSalvando(true)\n try {\n const r = await provider.contractServices?.(booking.id, linhas)\n if (!r?.ok) { setErro(RECUSA_CONTRATO[r?.reason ?? ''] ?? 'Não foi possível contratar.'); return }\n setContratando(false)\n setVersao((v) => v + 1)\n // A CADEIA DO V1: contratado → Contrato de Prestação → Termo de Sessão → o que sai HOJE.\n // Perguntar depois, num menu, faria a resposta virar tarefa esquecida.\n const indicados = servicos\n .filter((sv) => sv.fromIndication && sv.serviceId)\n .map((sv) => ({ serviceId: sv.serviceId, name: sv.name, quantity: sv.quantity, unitPrice: sv.price }))\n let lista: AttendanceContract[] = []\n try {\n lista = await garantirContratos(linhas, indicados)\n } catch (e) {\n setErro(e instanceof Error ? `Contratado, mas o contrato não foi gerado: ${e.message}` : 'Contratado, mas o contrato não foi gerado.')\n }\n setContratos(lista)\n const pendentes = lista.filter((c) => c.status === 'pending')\n .sort((a, b) => Number(a.isSessionTerm) - Number(b.isSessionTerm))\n filaAssinatura.current = { ids: pendentes.map((c) => c.id), depois: abrirExecucao }\n await proximaAssinatura(lista)\n } finally { setSalvando(false) }\n }\n\n /**\n * A ORDEM DAS BOLAS É FIXA — e isso é regra, não estética.\n *\n * *\"Cada bola mantém esta posição durante todo o atendimento — concluir uma\n * etapa muda só a cor, não o lugar\"*, diz a tela do V1. Sem ordenar, a\n * resposta do banco vem na ordem que ele quiser: ao concluir a avaliação, ela\n * pulou para depois da conta e a régua deixou de ser decorável.\n *\n * A ordem é a do fluxo: o que se pergunta antes de executar, depois o que se\n * cobra.\n */\n const ORDEM = ['form', 'evaluation', 'revision_link', 'contract', 'session_term', 'products', 'invoice_item']\n const porOrdem = (a: AttendanceRequirement, b: AttendanceRequirement) => {\n const d = ORDEM.indexOf(a.kind) - ORDEM.indexOf(b.kind)\n return d !== 0 ? d : a.id.localeCompare(b.id)\n }\n\n // Escopo do ATENDIMENTO primeiro (a anamnese vale para a visita inteira),\n // depois uma seção por serviço — a ordem em que o V1 desenha.\n // A ANAMNESE É UMA SÓ, mesmo quando o atendimento tem várias sessões.\n //\n // A exigência é gravada por sessão (é assim no V1, onde ela pendura na\n // execução). Duas sessões do mesmo serviço faziam a régua desenhar\n // \"Anamnese · Anamnese · Anamnese\" — três bolas para um formulário só. Aqui\n // elas viram uma, e ela só fica verde quando TODAS estão resolvidas: dizer\n // \"pronto\" com uma pendente atrás seria o indicador errado.\n const doAtendimento = React.useMemo(() => {\n const m = new Map<string, AttendanceRequirement>()\n for (const r of (rows ?? []).filter((x) => x.scope === 'attendance')) {\n const k = `${r.kind}:${r.refId ?? ''}`\n const atual = m.get(k)\n if (!atual) { m.set(k, r); continue }\n if (atual.status === 'resolved' && r.status !== 'resolved') m.set(k, r)\n }\n return [...m.values()].sort(porOrdem)\n }, [rows])\n\n // UMA SEÇÃO POR SESSÃO, não por serviço.\n //\n // Contratar dois Botox cria duas sessões — duas idas à cadeira, cada uma com\n // a sua régua. Agrupando por serviço as duas caíam na mesma seção e as bolas\n // vinham em dobro, com o contador dizendo 2/4 sobre um procedimento que tem\n // dois passos. Quando o mesmo serviço repete, o título numera: \"1 de 2\".\n const porServico = React.useMemo(() => {\n const m = new Map<string, { nome: string; itens: AttendanceRequirement[] }>()\n for (const r of rows ?? []) {\n if (r.scope === 'attendance') continue\n const k = r.sessionId ?? r.serviceId ?? '—'\n if (!m.has(k)) m.set(k, { nome: r.serviceName ?? 'Serviço', itens: [] })\n m.get(k)!.itens.push(r)\n }\n const grupos = [...m.values()]\n const quantos = new Map<string, number>()\n for (const g of grupos) quantos.set(g.nome, (quantos.get(g.nome) ?? 0) + 1)\n const vistos = new Map<string, number>()\n for (const g of grupos) {\n g.itens.sort(porOrdem)\n const n = quantos.get(g.nome) ?? 1\n if (n > 1) {\n const i = (vistos.get(g.nome) ?? 0) + 1\n vistos.set(g.nome, i)\n g.nome = `${g.nome} · ${i} de ${n}`\n }\n }\n return grupos\n }, [rows])\n\n const faltaParaTerminar = (rows ?? []).filter((r) => r.blocksFinish && r.status === 'pending')\n\n /** Alguma tarefa tomou a moldura? O painel se recolhe enquanto ela dura. */\n const tarefaAberta = Boolean(assinando || vinculando || executando || lancando || avaliando || confirmando || contratando || (preenchendo?.refId && booking.clientId))\n\n React.useEffect(() => {\n if (!avaliando) return\n let vivo = true\n const t = setTimeout(async () => {\n try {\n const r = await provider.searchServices?.(busca)\n if (vivo) setCatalogo(r ?? [])\n } catch { if (vivo) setCatalogo([]) }\n }, 250)\n return () => { vivo = false; clearTimeout(t) }\n }, [avaliando, busca])\n\n React.useEffect(() => {\n if (!lancando) return\n let vivo = true\n const t = setTimeout(async () => {\n try {\n const r = await provider.searchGoods?.(buscaInsumo)\n if (vivo) setInsumos(r ?? [])\n } catch { if (vivo) setInsumos([]) }\n }, 250)\n return () => { vivo = false; clearTimeout(t) }\n }, [lancando, buscaInsumo])\n\n /** O botão **Padrão** do V1: traz o kit da ficha técnica do serviço. */\n async function trazerPadrao() {\n if (!lancando) return\n const kit = (await provider.getServiceKit?.(lancando.serviceId)) ?? []\n setUsados((xs) => {\n const tem = new Set(xs.map((x) => x.productId))\n return [...xs, ...kit.filter((k) => !tem.has(k.productId))\n .map((k) => ({ productId: k.productId, name: k.name, qtd: k.quantity, unitId: k.unitId }))]\n })\n }\n\n React.useEffect(() => {\n if (!vinculando) return\n let vivo = true\n ;(async () => {\n try {\n const r = await provider.getRevisionCandidates?.(booking.id)\n if (vivo) setCandidatos(r ?? [])\n } catch { if (vivo) setCandidatos([]) }\n })()\n return () => { vivo = false }\n }, [vinculando, booking.id])\n\n async function ligarRevisao(parentSessionId: string) {\n if (!vinculando?.sessionId) return\n setSalvando(true)\n try {\n const r = await provider.linkRevision?.(vinculando.sessionId, parentSessionId)\n if (!r?.ok) {\n setErro(r?.reason === 'original_de_outro_paciente'\n ? 'Esse procedimento é de outro paciente.'\n : (RECUSA_CONTRATO[r?.reason ?? ''] ?? 'Não foi possível vincular a revisão.'))\n return\n }\n setVinculando(null)\n setCandidatos(null)\n setVersao((v) => v + 1)\n } finally { setSalvando(false) }\n }\n\n /** A lista do que foi contratado, com o que já saiu marcado. */\n async function abrirExecucao() {\n const sess = (await provider.getAttendanceSessions?.(booking.id)) ?? []\n const linhas = sess\n .filter((x) => x.serviceId)\n .map((x) => ({ serviceId: x.serviceId as string, name: x.serviceName ?? 'Serviço', feito: x.status === 'executed' }))\n if (linhas.length) setExecutando(linhas)\n }\n\n async function salvarExecucao() {\n if (!executando) return\n setSalvando(true)\n try {\n const r = await provider.executeServices?.(\n booking.id,\n executando.filter((x) => x.feito).map((x) => x.serviceId),\n )\n if (!r?.ok) { setErro(RECUSA_CONTRATO[r?.reason ?? ''] ?? 'Não foi possível registrar a execução.'); return }\n setExecutando(null)\n setVersao((v) => v + 1)\n } finally { setSalvando(false) }\n }\n\n async function concluirProdutos() {\n if (!lancando) return\n setSalvando(true)\n try {\n const r = await provider.recordUsedProducts?.(\n booking.id,\n usados.map((u) => ({ serviceId: lancando.serviceId, productId: u.productId, quantity: u.qtd, unitId: u.unitId })),\n )\n if (!r?.ok) { setErro(RECUSA_CONTRATO[r?.reason ?? ''] ?? 'Não foi possível lançar os produtos.'); return }\n setLancando(null)\n setUsados([])\n setVersao((v) => v + 1)\n } finally { setSalvando(false) }\n }\n\n // The client's prepaid services become one-tap indications, as in V1's evaluation form.\n const [atalhosPrepago, setAtalhosPrepago] = React.useState<RecommendationShortcut[]>([])\n React.useEffect(() => {\n if (!preenchendo || !booking.clientId || !provider.getPrepaidItems) { setAtalhosPrepago([]); return }\n let vivo = true\n provider.getPrepaidItems(booking.clientId)\n .then((r) => {\n if (!vivo) return\n const vistos = new Set<string>()\n setAtalhosPrepago(r.open.filter((o) => !vistos.has(o.serviceId) && vistos.add(o.serviceId))\n .map((o) => ({ serviceId: o.serviceId, name: o.serviceName, unitPrice: 0, hint: 'já pago' })))\n })\n .catch(() => { if (vivo) setAtalhosPrepago([]) })\n return () => { vivo = false }\n }, [preenchendo, booking.clientId, provider])\n\n /**\n * A form with an \"Indicações\" field IS the evaluation (V1 template \"Avaliação\"): what it\n * indicates goes to the CRM, and the next question is \"O que o cliente deseja contratar?\".\n */\n async function salvouFormulario(r: FormFillResult) {\n setVersao((v) => v + 1)\n if (!r.recommendations.length || !provider.completeEvaluation) return\n const res = await provider.completeEvaluation(\n booking.id,\n r.recommendations.map((l) => ({ serviceId: l.serviceId, quantity: l.quantity })),\n )\n if (!res?.ok) { setErro(RECUSA_CONTRATO[res?.reason ?? ''] ?? 'A avaliação foi salva, mas as indicações não foram registradas.'); return }\n setPreenchendo(null)\n setVersao((v) => v + 1)\n await abrirContratacao()\n }\n\n async function concluirAvaliacao() {\n setSalvando(true)\n try {\n const r = await provider.completeEvaluation?.(\n booking.id,\n indicados.map((i) => ({ serviceId: i.id, quantity: i.qtd })),\n )\n if (!r?.ok) { setErro(RECUSA_CONTRATO[r?.reason ?? ''] ?? 'Não foi possível concluir a avaliação.'); return }\n setAvaliando(false)\n setIndicados([])\n setVersao((v) => v + 1)\n } finally { setSalvando(false) }\n }\n\n /**\n * FINALIZAR. Duas recusas e elas são o oposto uma da outra: exigência que\n * bloqueia TRAVA; serviço não executado só AVISA — a segunda chamada passa.\n * Travar o Finalizar criaria um atendimento sem saída pela interface.\n */\n /**\n * PEDIR A GRAVAÇÃO — e aqui, não na fila da recepção.\n *\n * O `plugin-scribe` expõe um evento de janela justamente para *\"a agenda\n * ganhar um botão de gravar sem depender do scribe\"*. O botão ficou primeiro\n * no cartão do check-in, e estava no lugar errado: **quem usa o check-in é a\n * secretaria**, e gravar o atendimento é gesto de quem atende. Mora onde o\n * profissional está — dentro do atendimento em curso.\n *\n * Não dispara sozinho ao iniciar: gravar pede consentimento, e um diálogo de\n * consentimento que aparece sem ser chamado é um pedido que a pessoa aprende\n * a fechar sem ler.\n */\n function pedirGravacao() {\n window.dispatchEvent(new CustomEvent('scribe:start', {\n detail: {\n appointmentId: booking.id,\n subjectId: booking.clientId ?? undefined,\n subjectName: booking.clientName ?? undefined,\n },\n }))\n }\n\n async function finalizar(force: boolean) {\n setEncerrando(true)\n try {\n const r = await provider.finishAttendance?.(booking.id, force)\n if (r?.reason === 'servicos_nao_executados') { setConfirmando(r.itens ?? []); return }\n if (!r?.ok) {\n // A recusa DIZ QUAL É. Uma frase única para motivos diferentes manda\n // procurar defeito onde há só um atendimento já encerrado em outra\n // aba — ou um que é de outra pessoa.\n const MOTIVO: Record<string, string> = {\n exigencia_bloqueia: 'Falta uma etapa que impede encerrar este atendimento.',\n atendimento_nao_esta_em_curso: 'Este atendimento já foi encerrado.',\n nao_e_seu_atendimento: 'Este atendimento é de outro profissional.',\n sem_ficha_de_profissional: 'Seu login não está ligado a uma ficha de profissional.',\n not_found: 'Este agendamento não existe mais.',\n }\n setAvisoFinal(MOTIVO[r?.reason ?? ''] ?? 'Não foi possível encerrar o atendimento.')\n return\n }\n setConfirmando(null)\n onFinished?.()\n onClose()\n } finally { setEncerrando(false) }\n }\n\n /** O conteúdo da régua, igual nas duas molduras. */\n const corpo = (\n <>\n {/* UMA MOLDURA SÓ. A tarefa entra no LUGAR do painel, com seta\n de voltar — não numa segunda janela por cima da primeira.\n Empilhar modais deixava a de trás visível e ilegível, e o X\n virava a única porta: desistir de uma etapa fechava o\n atendimento inteiro. */}\n {tarefaAberta ? (\n <>\n\n {/* O QUE O CLIENTE DESEJA CONTRATAR? — o diálogo que o V1 abre sozinho\n ao concluir a avaliação, e o passo que CRIA A DÍVIDA.\n\n \"Agora não\" fecha e NÃO GRAVA NADA — conferido no V1 pelo espião de\n rede, e é o que permite ao paciente pensar sem que o sistema decida\n por ele. O botão de ação diz quantos e quanto, porque é o número que\n a pessoa vai ouvir em voz alta. */}\n {/* O VÍNCULO DA REVISÃO — e o prazo à vista.\n A lista é de TODO serviço executado do paciente, e não de candidatos\n filtrados: quem atende reconhece o procedimento, e filtro silencioso\n esconde justamente o caso fora do padrão. O prazo aparece ao lado\n porque revisão fora do prazo é decisão comercial, não erro de\n sistema — e quem decide precisa do número. */}\n {vinculando && (\n <TarefaPane titulo={<>O que esta revisão revisa?</>} aoVoltar={() => { setVinculando(null); setCandidatos(null) }}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3\">\n {candidatos === null ? (\n <div className=\"space-y-2\" aria-busy=\"true\">\n {[0, 1, 2].map((i) => <div key={i} className=\"h-10 animate-pulse rounded-lg bg-muted\" />)}\n </div>\n ) : candidatos.length === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">\n Este paciente ainda não tem procedimento executado para revisar.\n </p>\n ) : (\n <ul className=\"divide-y rounded-lg border\">\n {candidatos.map((c) => (\n <li key={c.sessionId}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={salvando}\n onClick={() => ligarRevisao(c.sessionId)}\n className=\"font-normal justify-start rounded-none whitespace-normal flex w-full items-center gap-3 px-3 py-2 text-left hover:bg-muted disabled:opacity-40\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm\">{c.serviceName ?? 'Serviço'}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n {c.executedOn ? new Date(c.executedOn).toLocaleDateString('pt-BR') : 'sem data'}\n {c.daysSince != null ? ` · há ${c.daysSince} dia${c.daysSince === 1 ? '' : 's'}` : ''}\n </p>\n </div>\n {/* Prazo ausente não vira \"fora do prazo\": vira SEM\n prazo, e a tela diz isso em vez de inventar um. */}\n <span className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium ${\n c.withinDeadline === null ? 'bg-muted text-muted-foreground'\n : c.withinDeadline ? 'bg-success/15 text-success'\n : 'bg-warning/15 text-warning-foreground'\n }`}>\n {c.withinDeadline === null ? 'sem prazo'\n : c.withinDeadline ? `no prazo (${c.deadlineDays}d)`\n : `fora do prazo (${c.deadlineDays}d)`}\n </span>\n </Button>\n </li>\n ))}\n </ul>\n )}\n </div>\n <div className=\"flex items-center justify-end border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => { setVinculando(null); setCandidatos(null) }}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n </div>\n </TarefaPane>\n )}\n\n {/* EXECUTAR NESTE ATENDIMENTO — o que couber hoje.\n \"Marque os serviços que serão executados agora. Os demais ficam\n contratados para execução em outro atendimento.\" É daqui que nasce o\n saldo *a executar* na conta do cliente, e o caso que a demonstração do\n V1 narra: o labial fica para depois da festa. */}\n {executando && (\n <TarefaPane titulo={<>Executar neste atendimento</>} aoVoltar={() => setExecutando(null)}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3\">\n <p className=\"pb-2 text-[11px] text-muted-foreground\">\n Marque os serviços que serão executados agora. Os demais ficam contratados\n para execução em outro atendimento.\n </p>\n <ul className=\"divide-y rounded-lg border\">\n {executando.map((x) => (\n <li key={x.serviceId} className=\"flex items-center gap-3 px-3 py-2\">\n <Checkbox\n checked={x.feito}\n onChange={(feito) => setExecutando((xs) => (xs ?? []).map((y) => y.serviceId === x.serviceId\n ? { ...y, feito } : y))}\n aria-label={x.name}\n />\n <span className=\"min-w-0 flex-1 truncate text-sm\">{x.name}</span>\n <span className={`shrink-0 text-[10px] ${x.feito ? 'text-success' : 'text-muted-foreground'}`}>\n {x.feito ? 'hoje' : 'fica para outra data'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n <div className=\"flex items-center justify-end gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setExecutando(null)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={salvarExecucao} disabled={salvando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {salvando ? 'Registrando…' : 'Confirmar'}\n </Button>\n </div>\n </TarefaPane>\n )}\n\n {/* PRODUTOS UTILIZADOS — um bloco por serviço, e NADA BAIXA AQUI.\n A frase da demonstração do V1: \"Ele vem tudo pra cá primeiro. Vem pra\n aprovação de dispensa.\" O que se lança aqui entra na fila da Auditoria\n de Uso; quem confirma é o estoque. */}\n {lancando && (\n <TarefaPane titulo={<>Produtos utilizados — {lancando.serviceName}</>} aoVoltar={() => setLancando(null)}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Input\n value={buscaInsumo}\n onChange={(e) => setBuscaInsumo(e.target.value)}\n placeholder=\"Buscar produto…\"\n className=\"h-auto px-2.5 py-1.5\"\n />\n </div>\n {/* O atalho que o V1 chama de **Padrão**: o kit da ficha\n técnica, para corrigir em vez de digitar do zero. */}\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={trazerPadrao}\n className=\"shrink-0 rounded-button border border-input px-2.5 py-1.5 text-xs font-medium hover:bg-muted\">\n Padrão\n </Button>\n </div>\n\n {usados.length > 0 && (\n <ul className=\"divide-y rounded-lg border\">\n {usados.map((u) => (\n <li key={u.productId} className=\"flex items-center gap-2 px-3 py-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">{u.name}</span>\n <div className=\"w-16 shrink-0\">\n <Input\n type=\"number\" min={0} step=\"0.01\" value={u.qtd}\n onChange={(e) => setUsados((xs) => xs.map((x) => x.productId === u.productId\n ? { ...x, qtd: Math.max(0, Number(e.target.value) || 0) } : x))}\n className=\"h-auto px-1.5 py-1 text-center text-xs\"\n aria-label={`Quantidade de ${u.name}`}\n />\n </div>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setUsados((xs) => xs.filter((x) => x.productId !== u.productId))}\n className=\"font-normal shrink-0 text-xs text-destructive hover:underline\">Tirar</Button>\n </li>\n ))}\n </ul>\n )}\n\n <ul className=\"max-h-48 space-y-0.5 overflow-y-auto\">\n {insumos.filter((i) => !usados.some((u) => u.productId === i.id)).map((i) => (\n <li key={i.id}>\n <Button variant=\"bare\" size=\"bare\" type=\"button\"\n onClick={() => setUsados((xs) => [...xs, { productId: i.id, name: i.name, qtd: 1, unitId: null }])}\n className=\"font-normal block justify-start w-full truncate rounded-lg px-2 py-1.5 text-left text-sm hover:bg-muted\">\n {i.name}\n </Button>\n </li>\n ))}\n {insumos.length === 0 && (\n <li className=\"px-2 py-3 text-center text-xs text-muted-foreground\">\n {buscaInsumo ? 'Nenhum produto com esse nome.' : 'Nenhum produto cadastrado ainda.'}\n </li>\n )}\n </ul>\n\n {/* O selo do V1, e o que ele promete. */}\n <p className=\"rounded-lg bg-warning/10 px-3 py-2 text-[11px] text-warning-foreground\">\n ⚠ Baixar no estoque — o que for lançado aqui vai para a fila da Auditoria de Uso.\n Nada é baixado agora.\n </p>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <span className=\"text-[11px] text-muted-foreground\">\n {usados.length === 0 ? 'Concluir sem lançar nada é válido.' : `${usados.length} produto${usados.length > 1 ? 's' : ''}`}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setLancando(null)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={concluirProdutos} disabled={salvando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {salvando ? 'Lançando…' : 'Concluir'}\n </Button>\n </div>\n </div>\n </TarefaPane>\n )}\n\n {/* A AVALIAÇÃO — e o que ela deixa: os SERVIÇOS INDICADOS.\n A tela do V1 enuncia a regra: \"Indique procedimentos ou produtos para\n o cliente — eles alimentam as recomendações do CRM e a etapa de\n orçamento.\" Indicação não é venda; quem decide cobrar é o paciente, no\n passo seguinte. Por isso aqui não há preço somado nem botão de\n contratar: só o que o profissional recomenda, e quanto. */}\n {avaliando && (\n <TarefaPane titulo={<>Avaliação — serviços indicados</>} aoVoltar={() => setAvaliando(false)}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3 space-y-3\">\n {indicados.length > 0 && (\n <ul className=\"divide-y rounded-lg border\">\n {indicados.map((i) => (\n <li key={i.id} className=\"flex items-center gap-2 px-3 py-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">{i.name}</span>\n <div className=\"w-12 shrink-0\">\n <Input\n type=\"number\" min={1} value={i.qtd}\n onChange={(e) => setIndicados((xs) => xs.map((x) => x.id === i.id\n ? { ...x, qtd: Math.max(1, Math.floor(Number(e.target.value) || 1)) } : x))}\n className=\"h-auto px-1.5 py-1 text-center text-xs\"\n aria-label={`Quantidade de ${i.name}`}\n />\n </div>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setIndicados((xs) => xs.filter((x) => x.id !== i.id))}\n className=\"font-normal shrink-0 text-xs text-destructive hover:underline\">Tirar</Button>\n </li>\n ))}\n </ul>\n )}\n\n <Input\n value={busca}\n onChange={(e) => setBusca(e.target.value)}\n placeholder=\"Buscar serviço para indicar…\"\n className=\"h-auto px-2.5 py-1.5\"\n />\n\n <ul className=\"max-h-56 space-y-0.5 overflow-y-auto\">\n {catalogo\n .filter((c) => !indicados.some((i) => i.id === c.id))\n .map((c) => (\n <li key={c.id}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setIndicados((xs) => [...xs, { ...c, qtd: 1 }])}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left hover:bg-muted\"\n >\n <span className=\"min-w-0 flex-1 truncate text-sm\">{c.name}</span>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatCurrency(c.price, 'BRL')}\n </span>\n </Button>\n </li>\n ))}\n {catalogo.length === 0 && (\n <li className=\"px-2 py-3 text-center text-xs text-muted-foreground\">\n {busca ? 'Nenhum serviço com esse nome.' : 'Carregando o catálogo…'}\n </li>\n )}\n </ul>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <span className=\"text-[11px] text-muted-foreground\">\n {indicados.length === 0 ? 'Concluir sem indicar nada é válido.'\n : `${indicados.length} indicado${indicados.length > 1 ? 's' : ''}`}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setAvaliando(false)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={concluirAvaliacao} disabled={salvando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {salvando ? 'Concluindo…' : 'Concluir avaliação'}\n </Button>\n </div>\n </div>\n </TarefaPane>\n )}\n\n {assinando && (\n <TarefaPane titulo={<>{assinando.templateName}</>} aoVoltar={() => { filaAssinatura.current = { ids: [], depois: null }; setAssinando(null) }}>\n <ContractSignPane\n key={assinando.id}\n contract={assinando}\n defaultSignerName={booking.clientName}\n onSigned={async () => {\n setVersao((v) => v + 1)\n const lista = await listAttendanceContracts(booking.id).catch(() => contratos)\n setContratos(lista)\n await proximaAssinatura(lista)\n }}\n onClose={() => { filaAssinatura.current = { ids: [], depois: null }; setAssinando(null) }}\n />\n </TarefaPane>\n )}\n\n {/* A ANAMNESE, PREENCHIDA DE DENTRO DO ATENDIMENTO.\n O V1 manda o profissional até a ficha do cliente para isso. A bola já\n sabe qual modelo falta; abrir o formulário aqui é o mesmo gesto com um\n passo a menos — e ao gravar a régua reapura e a bola fecha sozinha. */}\n {preenchendo?.refId && booking.clientId && (\n <TarefaPane\n titulo={<>{preenchendo.refName ?? 'Formulário'}</>}\n aoVoltar={() => setPreenchendo(null)}\n >\n <WidgetSlot\n zone={FORMS_ZONES.formFill}\n frame=\"inline\"\n templateId={preenchendo.refId}\n personId={booking.clientId}\n personName={booking.clientName}\n subject={{ type: 'appointment', id: booking.id }}\n productId={preenchendo.scope === 'service' ? preenchendo.serviceId : null}\n professionalId={booking.professionalId ?? null}\n recommendationShortcuts={atalhosPrepago}\n onSaved={salvouFormulario}\n onClose={() => setPreenchendo(null)}\n />\n </TarefaPane>\n )}\n\n {/* FINALIZAR ATENDIMENTO? — o diálogo que AVISA E DEIXA PASSAR.\n Texto do V1, palavra por palavra: travar aqui criaria um atendimento\n sem saída pela interface, e quem não executou cancela o item na conta\n do cliente. O aviso existe para que \"finalizei sem ver\" não seja uma\n desculpa possível. */}\n {confirmando && (\n <TarefaPane titulo={<>Finalizar atendimento?</>} aoVoltar={() => setConfirmando(null)}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3 space-y-2\">\n {confirmando.length > 0 && (\n <>\n <p className=\"text-xs font-medium text-warning-foreground\">\n {confirmando.length === 1\n ? '1 serviço ainda não foi executado:'\n : `${confirmando.length} serviços ainda não foram executados:`}\n </p>\n <ul className=\"list-disc pl-4 text-xs text-muted-foreground\">\n {confirmando.map((n) => <li key={n}>{n}</li>)}\n </ul>\n <p className=\"text-[11px] text-muted-foreground\">\n Finalizar agora registra estes serviços como executados. Se não foram\n realizados, cancele os itens na conta do cliente antes de encerrar.\n </p>\n </>\n )}\n <p className=\"text-[11px] text-muted-foreground\">\n Isso encerra o atendimento de {booking.clientName ?? 'cliente'} e avisa a recepção\n para receber. Você poderá consultá-lo no histórico.\n </p>\n </div>\n <div className=\"flex items-center justify-between gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setConfirmando(null)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Cancelar\n </Button>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => finalizar(true)} disabled={encerrando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {encerrando ? 'Encerrando…' : 'Finalizar assim mesmo'}\n </Button>\n </div>\n </TarefaPane>\n )}\n\n {contratando && (\n <TarefaPane titulo={<>O que o cliente deseja contratar?</>} aoVoltar={() => setContratando(false)}>\n <div className=\"flex-1 overflow-y-auto px-5 py-3\">\n {servicos.length === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">\n Este atendimento não tem serviços lançados.\n </p>\n ) : (\n <ul className=\"divide-y\">\n {servicos.map((sv) => {\n const id = sv.serviceId\n const qtd = marcados[id] ?? 0\n return (\n <li key={sv.id} className=\"flex items-center gap-3 py-2.5\">\n <Checkbox\n checked={qtd > 0}\n disabled={!id}\n onChange={(on) => id && setMarcados((m) => ({ ...m, [id]: on ? Math.max(1, qtd) : 0 }))}\n aria-label={sv.name}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm\">{sv.name}</p>\n {/* O rótulo do V1: a linha diz de ONDE ela veio. */}\n {/* A ORIGEM, dita. O V1 escreve as duas quando as\n duas existem: \"Interesse do cliente · Indicado\n pelo profissional\". */}\n <p className=\"text-[11px] text-muted-foreground\">\n {[sv.fromInterest ? 'Interesse do cliente' : null,\n sv.fromIndication ? 'Indicado pelo profissional' : null]\n .filter(Boolean).join(' · ')}\n {sv.alreadyContracted ? ' · já na conta' : ''}\n {sv.quantity > 1 ? ` · ${sv.quantity} indicados` : ''}\n </p>\n </div>\n {/* O TETO É O QUE FOI INDICADO, e o zero desmarca.\n A regra é do V1: contratar é aceitar o que foi\n oferecido, não abrir um pedido novo em cima dele.\n Sem o teto dava para digitar 5 onde 2 foram\n indicados — e o rodapé somava R$ 7.994 de uma\n avaliação que ofereceu R$ 3.797. */}\n <div className=\"w-12 shrink-0\">\n <Input\n type=\"number\"\n min={0}\n max={sv.quantity}\n value={qtd}\n disabled={!id || qtd === 0}\n onChange={(e) => {\n if (!id) return\n const n = Math.floor(Number(e.target.value) || 0)\n setMarcados((m) => ({ ...m, [id]: Math.max(0, Math.min(sv.quantity, n)) }))\n }}\n className=\"h-auto px-1.5 py-1 text-center text-xs disabled:opacity-40\"\n aria-label={`Quantidade de ${sv.name}`}\n />\n </div>\n <span className=\"w-20 shrink-0 text-right text-xs tabular-nums\">\n {formatCurrency(sv.price, 'BRL')}\n </span>\n </li>\n )\n })}\n </ul>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setContratando(false)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={contratar}\n disabled={salvando || !Object.values(marcados).some((q) => q > 0)}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\"\n >\n {salvando ? 'Contratando…' : (() => {\n const escolhidos = servicos.filter((sv) => sv.serviceId && (marcados[sv.serviceId] ?? 0) > 0)\n const total = escolhidos.reduce((t, sv) => t + sv.price * (marcados[sv.serviceId as string] ?? 0), 0)\n return `Contratar (${escolhidos.length}) · ${formatCurrency(total, 'BRL')}`\n })()}\n </Button>\n </div>\n </TarefaPane>\n )}\n </>\n ) : (\n <>\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n {erro && (\n <p className=\"rounded-lg bg-destructive/10 px-3 py-2 text-xs text-destructive\">{erro}</p>\n )}\n {avisoFinal && (\n <p className=\"rounded-lg bg-warning/10 px-3 py-2 text-xs text-warning-foreground\">{avisoFinal}</p>\n )}\n\n {rows === null ? (\n /* Skeleton shaped like WHAT IS COMING — and what is coming\n follows from a state we already know before the query: in\n progress brings the step circles; closed brings the record,\n because 99.4% of migrated history carries no requirement at\n all. Drawing circles and then swapping them for a text card\n is the screen jumping under someone who started reading. */\n emCurso ? (\n <div className=\"flex gap-3\" aria-busy=\"true\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex w-16 flex-col items-center gap-1\">\n <div className=\"h-11 w-11 animate-pulse rounded-full bg-muted\" />\n <div className=\"h-2 w-12 animate-pulse rounded bg-muted/70\" />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\" aria-busy=\"true\">\n <div className=\"h-2.5 w-32 animate-pulse rounded bg-muted/70\" />\n {[0, 1].map((i) => (\n <div key={i} className=\"space-y-2 rounded-xl border px-3 py-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"h-3.5 w-40 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-16 animate-pulse rounded bg-muted/70\" />\n </div>\n <div className=\"h-2.5 w-52 animate-pulse rounded bg-muted/60\" />\n </div>\n ))}\n </div>\n )\n ) : rows.length === 0 && !record?.length ? (\n /* Régua vazia é resposta legítima e precisa DIZER por quê: sem\n modelo de formulário e sem ficha técnica cadastrados, não há o\n que exigir. Uma tela em branco faria procurar defeito. */\n <p className=\"text-xs text-muted-foreground\">\n Este atendimento não tem exigências cadastradas. Formulários e fichas técnicas\n dos serviços é que dizem o que cada procedimento pede.\n </p>\n ) : (\n <>\n {doAtendimento.length > 0 && (\n <section className=\"space-y-2\">\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Etapas do atendimento\n </h3>\n <div className=\"flex gap-3 overflow-x-auto pb-1\">\n {doAtendimento.map((r) => (\n <Bola\n key={r.id}\n r={r}\n onClick={formsFillable && r.kind === 'form' && r.refId && r.status === 'pending' && booking.clientId\n ? () => setPreenchendo(r)\n : (r.kind === 'contract' || r.kind === 'session_term') && r.refId\n // Signed opens too: V1 shows who signed and when, and prints it.\n ? () => { filaAssinatura.current = { ids: [], depois: null }; setAssinando(contratos.find((c) => c.id === r.refId) ?? null) }\n : undefined}\n />\n ))}\n </div>\n </section>\n )}\n\n {porServico.map((s) => {\n const feitas = s.itens.filter((i) => i.status === 'resolved').length\n const validas = s.itens.filter((i) => i.status !== 'not_applicable').length\n const completo = feitas === validas && validas > 0\n return (\n <section key={s.nome} className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-medium\">{s.nome}</h3>\n {/* O contador do V1: resolvidas / totais. */}\n <span className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium ${\n completo ? 'bg-success/15 text-success' : 'bg-warning/15 text-warning-foreground'\n }`}>\n {completo ? '✓ ' : ''}{feitas}/{validas}\n </span>\n </div>\n <div className=\"flex gap-3 overflow-x-auto pb-1\">\n {s.itens.map((r) => (\n <Bola\n key={r.id}\n r={r}\n onClick={\n // Formulário pendente preenche em QUALQUER estado — antes de\n // começar (a recepção) e depois de encerrar (o tardio do V1).\n formsFillable && r.kind === 'form' && r.refId && r.status === 'pending' && booking.clientId\n ? () => setPreenchendo(r)\n : somenteLeitura ? undefined\n : r.kind === 'revision_link' && r.status === 'pending' ? () => setVinculando(r)\n : r.kind === 'products' && r.status === 'pending'\n ? () => { setUsados([]); setLancando({ serviceId: r.serviceId ?? '', serviceName: s.nome }) }\n : r.kind === 'evaluation' && r.status === 'pending' ? () => setAvaliando(true)\n : r.kind === 'invoice_item' && r.status === 'pending' ? abrirContratacao\n : undefined\n }\n />\n ))}\n </div>\n </section>\n )\n })}\n\n {/* WHAT THE ATTENDANCE WAS — the promise V1 makes on close:\n \"you'll be able to consult it in the history\". The ruler\n above says what was missing; this says what happened, and\n it is the only thing migrated history has to show: of\n 233,981 sessions, 1,338 bookings carry a requirement. */}\n {!!record?.length && (\n <section className=\"space-y-2\">\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {emCurso ? 'O que já foi registrado' : 'Registro do atendimento'}\n </h3>\n <ul className=\"space-y-2\">\n {record.map((s) => (\n <li key={s.sessionId} className=\"rounded-xl border px-3 py-2.5\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {s.serviceName ?? 'Serviço não informado'}\n </span>\n {s.price != null && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatCurrency(s.price, 'BRL')}\n </span>\n )}\n </div>\n\n {/* WHO PERFORMED IT, not who was booked. V1 keeps\n the two apart, and history is only trustworthy\n with the name of whoever did the work. */}\n {s.hadPerformer && (\n <p className=\"mt-0.5 flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <UserRound className=\"h-3 w-3 shrink-0\" aria-hidden />\n {s.performedByName\n ? `Executado por ${s.performedByName}`\n /* The name is not ours to show: a professional\n allocated to another unit is out of reach\n from here. Saying someone performed it is\n true; dropping the line would claim nobody\n did. */\n : 'Executado por profissional de outra unidade'}\n </p>\n )}\n\n {s.products.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Produtos utilizados\n </p>\n <ul className=\"mt-1 space-y-0.5\">\n {s.products.map((p) => (\n <li key={p.id} className=\"flex flex-wrap items-baseline gap-x-2 text-xs\">\n <Package className=\"h-3 w-3 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{p.name}</span>\n <span className=\"shrink-0 tabular-nums\">\n {p.quantity ?? '—'}{p.unit ? ` ${p.unit}` : ''}\n </span>\n {/* V1's \"Padrão: N\" only shows when the\n used amount DIVERGES from the standard\n — repeating it when they match is noise\n across 117k rows. */}\n {p.standard != null && p.standard !== p.quantity && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n padrão {p.standard}\n </span>\n )}\n {!p.audited && (\n <span className=\"shrink-0 rounded-full bg-warning/15 px-1.5 text-[10px] text-warning-foreground\">\n a conferir\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* THE CLINICAL NOTES. 176,975 of them migrated and\n not one line of code read them. It is what the\n professional checks before injecting. */}\n {s.notes && (\n <div className=\"mt-2\">\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Evolução clínica\n </p>\n <p className=\"mt-0.5 whitespace-pre-wrap text-xs leading-relaxed\">{s.notes}</p>\n </div>\n )}\n </li>\n ))}\n </ul>\n </section>\n )}\n </>\n )}\n </div>\n\n {/* O rodapé do V1: o cronômetro e o Finalizar. A AÇÃO BLOQUEADA DIZ O\n QUE FALTA — nunca um botão morto em silêncio. */}\n <div className=\"border-t fayz-glass-divider px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" aria-hidden />\n {emCurso ? 'Em atendimento' : naoIniciado ? 'Ainda não começou' : 'Atendimento encerrado'}\n </span>\n <div className=\"flex min-w-0 items-center gap-2\">\n {/* A porta que faltava: quem abria a régua de um agendamento\n não-iniciado lia \"encerrado\" e não tinha para onde ir. A\n trava é a do V1 — só o dono do agendamento inicia — e a\n recusa se explica em vez de sumir com o botão. */}\n {naoIniciado && !!provider.startAttendance && eu !== undefined && (\n (() => {\n const deOutro = !!booking.professionalId && !!eu && booking.professionalId !== eu\n const semFicha = eu === null\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {(recusaInicio || semFicha || deOutro) && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {recusaInicio\n ?? (semFicha ? 'Atender exige um login ligado a uma ficha de profissional.'\n : 'Este atendimento é de outro profissional.')}\n </span>\n )}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={semFicha || deOutro || iniciando}\n onClick={async () => {\n setIniciando(true)\n setRecusaInicio(null)\n try {\n const r = await provider.startAttendance?.(booking.id)\n if (!r?.ok) {\n setRecusaInicio(r?.reason === 'nao_e_seu_atendimento'\n ? 'Este atendimento é de outro profissional.'\n : 'Não foi possível iniciar o atendimento.')\n return\n }\n setStatusLocal('in_progress')\n setVersao((v) => v + 1)\n } finally { setIniciando(false) }\n }}\n className=\"shrink-0 rounded-button bg-success px-3 py-1.5 text-xs font-semibold text-success-foreground disabled:opacity-40\"\n >\n {iniciando ? 'Abrindo…' : 'Iniciar atendimento'}\n </Button>\n </div>\n )\n })()\n )}\n {!somenteLeitura && faltaParaTerminar.length > 0 && (\n <span className=\"truncate text-[11px] text-warning-foreground\">\n Falta {requirementLabel(faltaParaTerminar[0])}\n {faltaParaTerminar.length > 1 ? ` e mais ${faltaParaTerminar.length - 1}` : ''}\n </span>\n )}\n {!somenteLeitura && <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={pedirGravacao}\n aria-label=\"Gravar atendimento\"\n title=\"Gravar atendimento\"\n className=\"inline-flex shrink-0 items-center justify-center rounded-button border border-input p-1.5 hover:bg-muted\"\n >\n <Mic className=\"h-3.5 w-3.5\" aria-hidden />\n </Button>}\n\n {/* O que saiu hoje. Fica ao lado do Finalizar porque é a\n última pergunta antes de encerrar — e porque encerrar sem\n responder marca tudo como executado. */}\n {!somenteLeitura && <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={abrirExecucao}\n className=\"shrink-0 rounded-button border border-input px-2.5 py-1.5 text-xs font-medium hover:bg-muted\"\n >\n Executar…\n </Button>}\n {!somenteLeitura && <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => finalizar(false)}\n disabled={encerrando || faltaParaTerminar.length > 0}\n className=\"shrink-0 rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\"\n >\n {encerrando ? 'Encerrando…' : 'Finalizar'}\n </Button>}\n </div>\n </div>\n </div>\n </>\n )}\n </>\n )\n\n // A MESMA RÉGUA EM DUAS MOLDURAS. O conteúdo não muda: muda se ele mora numa\n // janela sobre a fila ou numa página inteira, que é onde o V1 o coloca.\n if (frame === 'page') {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden rounded-2xl border bg-card\">\n {/* Sem repetir o nome: o cabeçalho da tela já o diz. Aqui fica o que\n ele NÃO diz — quando é este atendimento e de quem ele é. */}\n <div className=\"flex items-center justify-between gap-3 border-b px-5 py-3\">\n <span className=\"truncate text-xs text-muted-foreground\">\n {new Date(booking.startsAt).toLocaleString('pt-BR', {\n weekday: 'short', day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit',\n })}\n {booking.professionalName ? ` · ${booking.professionalName}` : ''}\n </span>\n </div>\n {corpo}\n </div>\n )\n }\n\n // `ModalTask`, não um Modal próprio: aberta de dentro da ficha do cliente\n // (que já vive num modal), a régua toma a MOLDURA do anfitrião com\n // breadcrumb e volta — a regra da casa do \"Receber\" do financeiro. Sem\n // anfitrião, o fallback é um modal comum.\n // O título é o ATENDIMENTO, não o cliente: dentro da ficha o anfitrião já\n // diz o nome, e \"Isabela › Isabela\" no breadcrumb não diz nada.\n const tituloServicos = (booking.services ?? []).map((s) => s.name).join(', ')\n return (\n <ModalTask\n open={open}\n title={`${tituloServicos || 'Atendimento'} · ${new Date(booking.startsAt).toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' })}`}\n hint={\n <>\n {booking.clientName ?? 'Sem cliente'}\n {booking.professionalName ? ` · ${booking.professionalName}` : ''}\n </>\n }\n onClose={onClose}\n width=\"max-w-lg\"\n >\n {corpo}\n </ModalTask>\n )\n}\n","import React from 'react'\nimport { Stethoscope, Check, CircleDashed, RotateCcw } from 'lucide-react'\nimport { useAgendaProvider } from '../context'\nimport type { AttendanceRequirement, CalendarBooking } from '../types'\nimport { AttendanceRuler } from './AttendanceRuler'\nimport { Button } from '@fayz-ai/ui'\nimport { formatCurrency } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// O HISTÓRICO DE ATENDIMENTO, na ficha da pessoa.\n//\n// O V1 promete isto na hora de encerrar: *\"Isso encerra o atendimento de\n// <cliente>. Você poderá consultá-lo no histórico.\"* Sem esta porta a promessa\n// não se cumpre: a régua vive na fila do dia, e a fila do dia é de hoje.\n//\n// E é aqui que as 233.556 sessões clínicas que atravessaram do V1 ganham tela.\n// Elas estavam no banco desde o início deste porte, com a régua congelada de\n// cada uma, e nenhuma linha de TypeScript as lia.\n// ---------------------------------------------------------------------------\n\ninterface Linha {\n bookingId: string\n quando: string | null\n servicos: string\n profissional: string | null\n status: string\n /** What this attendance cost — V1's history card carries it. */\n total?: number | null\n /** This attendance revises an earlier procedure. 42k of them migrated. */\n isRevision?: boolean\n /** The read hit its cap, so this list is not the whole record. */\n truncated?: boolean\n feitas: number\n totais: number\n}\n\n/** Counter vocabulary, never the schema's. */\nconst STATUS_LABEL: Record<string, string> = {\n executed: 'Executado',\n invoiced: 'Faturado',\n in_service: 'Em atendimento',\n scheduled: 'Agendado',\n contracted: 'Contratado',\n quoted: 'Orçado',\n pending: 'A executar',\n}\n\nexport function PersonAttendancesWidget({ personId }: { personId: string }) {\n const provider = useAgendaProvider()\n const [linhas, setLinhas] = React.useState<Linha[] | null>(null)\n const [aberto, setAberto] = React.useState<CalendarBooking | null>(null)\n\n /** O atendimento EM CURSO desta pessoa, desenhado por inteiro no topo. */\n const [emCurso, setEmCurso] = React.useState<CalendarBooking | null>(null)\n\n const recarregar = React.useCallback(async () => {\n try {\n const r = await provider.getPersonAttendances?.(personId)\n setLinhas(r ?? [])\n } catch { setLinhas([]) }\n }, [personId, provider])\n\n React.useEffect(() => { void recarregar() }, [recarregar])\n\n // A RÉGUA MORA AQUI, e é o que o V1 diz com todas as letras: *\"Não há rota\n // `/atendimento`: a régua é montada SÓ dentro de `ClientInlineAttendance`,\n // que só existe na ficha.\"* Uma tela separada para o atendimento era um\n // lugar a mais para a mesma coisa — e tirava do profissional o resto da\n // ficha, que é justamente o que ele consulta enquanto atende.\n React.useEffect(() => {\n let vivo = true\n ;(async () => {\n const eu = (await provider.getCurrentPersonId?.()) ?? null\n if (!vivo || !eu) return\n const d = new Date()\n const iso = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n try {\n const bs = await provider.getBookings({\n dateRange: { start: `${iso}T00:00:00`, end: `${iso}T23:59:59` },\n professionalIds: [eu],\n statuses: ['in_progress'],\n })\n if (vivo) setEmCurso(bs.find((b) => b.clientId === personId) ?? null)\n } catch { if (vivo) setEmCurso(null) }\n })()\n return () => { vivo = false }\n }, [personId, provider])\n\n if (linhas === null) {\n return (\n <div className=\"space-y-2\" aria-busy=\"true\">\n {[0, 1, 2].map((i) => <div key={i} className=\"h-14 animate-pulse rounded-xl bg-muted/50\" />)}\n </div>\n )\n }\n\n if (!linhas.length) {\n return (\n // \"No attendance\" and \"no attendance HERE\" are different facts. Sessions\n // are unit-scoped, so a patient treated at another branch reads as never\n // treated — and someone would open a brand-new record for her.\n <p className=\"py-6 text-center text-xs text-muted-foreground\">\n Nenhum atendimento desta pessoa nesta unidade.\n </p>\n )\n }\n\n const historico = (\n <>\n <ul className=\"space-y-2\">\n {linhas.map((l) => {\n const completo = l.totais > 0 && l.feitas === l.totais\n return (\n <li key={l.bookingId}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={async () => {\n const b = await provider.getBookingById(l.bookingId)\n if (b) setAberto(b)\n }}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 rounded-xl border border-border bg-card px-3 py-2 text-left hover:bg-muted/40\"\n >\n <Stethoscope className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <p className=\"flex items-center gap-1.5 truncate text-sm font-medium\">\n <span className=\"min-w-0 truncate\">{l.servicos || 'Atendimento'}</span>\n {/* A revision is a different visit from the one that sold\n the procedure, and the V1 card marks it — without the\n mark the history reads as two purchases. */}\n {l.isRevision && (\n <RotateCcw className=\"h-3 w-3 shrink-0 text-muted-foreground\" aria-hidden />\n )}\n </p>\n {/* Date · professional · status · price — V1's history card,\n in that order. */}\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {l.quando ? new Date(l.quando).toLocaleDateString('pt-BR') : 'sem data'}\n {l.profissional ? ` · ${l.profissional}` : ''}\n {STATUS_LABEL[l.status] ? ` · ${STATUS_LABEL[l.status]}` : ''}\n {l.total != null\n ? ` · ${formatCurrency(l.total, 'BRL')}`\n : ''}\n </p>\n </div>\n {/* O contador da régua daquele dia, congelado. É o que permite\n responder, meses depois, o que aquele atendimento exigia — e\n o que ficou sem resposta. */}\n {l.totais > 0 && (\n <span className={`inline-flex shrink-0 items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${\n completo ? 'bg-success/15 text-success' : 'bg-warning/15 text-warning-foreground'\n }`}>\n {completo ? <Check className=\"h-3 w-3\" aria-hidden /> : <CircleDashed className=\"h-3 w-3\" aria-hidden />}\n {l.feitas}/{l.totais}\n </span>\n )}\n </Button>\n </li>\n )\n })}\n </ul>\n\n {linhas.some((l) => l.truncated) && (\n <p className=\"pt-2 text-center text-[11px] text-muted-foreground\">\n Mostrando os atendimentos mais recentes — este prontuário tem mais do que cabe aqui.\n </p>\n )}\n\n {aberto && (\n <AttendanceRuler booking={aberto} open onClose={() => setAberto(null)} />\n )}\n </>\n )\n\n if (!emCurso) return historico\n\n return (\n <div className=\"space-y-4\">\n <AttendanceRuler\n booking={emCurso}\n open\n frame=\"page\"\n onClose={() => { setEmCurso(null); void recarregar() }}\n onFinished={() => { setEmCurso(null); void recarregar() }}\n />\n <div>\n <p className=\"mb-2 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Atendimentos anteriores\n </p>\n {historico}\n </div>\n </div>\n )\n}\n\nexport type { AttendanceRequirement }\n"]}
@@ -0,0 +1,80 @@
1
+ import { useAgendaProvider } from './chunk-XTNSK4RJ.js';
2
+ import React from 'react';
3
+ import { Layers, Check, RotateCcw, CircleDashed } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function PersonServicesWidget({ personId }) {
7
+ const provider = useAgendaProvider();
8
+ const [rows, setRows] = React.useState(null);
9
+ React.useEffect(() => {
10
+ let alive = true;
11
+ (async () => {
12
+ try {
13
+ const r = await provider.getPersonServiceBalance?.(personId);
14
+ if (alive) setRows(r ?? []);
15
+ } catch {
16
+ if (alive) setRows([]);
17
+ }
18
+ })();
19
+ return () => {
20
+ alive = false;
21
+ };
22
+ }, [personId, provider]);
23
+ if (rows === null) {
24
+ return /* @__PURE__ */ jsx("ul", { className: "space-y-2", "aria-busy": "true", children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-3 rounded-xl border px-3 py-2.5", children: [
25
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-4 shrink-0 animate-pulse rounded bg-muted" }),
26
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1.5", children: [
27
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-44 animate-pulse rounded bg-muted" }),
28
+ /* @__PURE__ */ jsx("div", { className: "h-2.5 w-28 animate-pulse rounded bg-muted/70" })
29
+ ] }),
30
+ /* @__PURE__ */ jsx("div", { className: "h-5 w-16 shrink-0 animate-pulse rounded-full bg-muted/70" })
31
+ ] }, i)) });
32
+ }
33
+ if (!rows.length) {
34
+ return /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-xs text-muted-foreground", children: "Esta pessoa ainda n\xE3o tem servi\xE7o registrado nesta unidade." });
35
+ }
36
+ const owed = rows.reduce((t, r) => t + r.pending, 0);
37
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
38
+ owed > 0 && /* @__PURE__ */ jsx("p", { className: "rounded-xl bg-warning/10 px-3 py-2 text-xs text-warning-foreground", children: owed === 1 ? "1 sess\xE3o contratada e ainda n\xE3o executada." : `${owed} sess\xF5es contratadas e ainda n\xE3o executadas.` }),
39
+ /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: rows.map((r) => /* @__PURE__ */ jsxs(
40
+ "li",
41
+ {
42
+ className: "flex items-start gap-3 rounded-xl border border-border bg-card px-3 py-2.5",
43
+ children: [
44
+ /* @__PURE__ */ jsx(Layers, { className: "mt-0.5 h-4 w-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
45
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
46
+ /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-medium", children: r.serviceName }),
47
+ /* @__PURE__ */ jsxs("p", { className: "mt-0.5 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[11px] text-muted-foreground", children: [
48
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
49
+ /* @__PURE__ */ jsx(Check, { className: "h-3 w-3 shrink-0 text-success", "aria-hidden": true }),
50
+ r.executed,
51
+ " executada",
52
+ r.executed === 1 ? "" : "s"
53
+ ] }),
54
+ r.revisions > 0 && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
55
+ /* @__PURE__ */ jsx(RotateCcw, { className: "h-3 w-3 shrink-0", "aria-hidden": true }),
56
+ r.revisions,
57
+ " revis\xE3",
58
+ r.revisions === 1 ? "o" : "es"
59
+ ] }),
60
+ r.lastExecutedAt && /* @__PURE__ */ jsxs("span", { children: [
61
+ "\xFAltima em ",
62
+ new Date(r.lastExecutedAt).toLocaleDateString("pt-BR")
63
+ ] })
64
+ ] })
65
+ ] }),
66
+ r.pending > 0 && /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 rounded-full bg-warning/15 px-2 py-0.5 text-[10px] font-medium text-warning-foreground", children: [
67
+ /* @__PURE__ */ jsx(CircleDashed, { className: "h-3 w-3", "aria-hidden": true }),
68
+ r.pending,
69
+ " a executar"
70
+ ] })
71
+ ]
72
+ },
73
+ r.serviceId ?? r.serviceName
74
+ )) })
75
+ ] });
76
+ }
77
+
78
+ export { PersonServicesWidget };
79
+ //# sourceMappingURL=PersonServicesWidget-4RJGKX3K.js.map
80
+ //# sourceMappingURL=PersonServicesWidget-4RJGKX3K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/PersonServicesWidget.tsx"],"names":[],"mappings":"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","file":"PersonServicesWidget-4RJGKX3K.js","sourcesContent":["import React from 'react'\nimport { Layers, Check, CircleDashed, RotateCcw } from 'lucide-react'\nimport { useAgendaProvider } from '../context'\nimport type { PersonServiceBalance } from '../types'\n\n// ---------------------------------------------------------------------------\n// THE SERVICES TAB — V1 keeps it beside \"Atendimentos\", and the split matters.\n//\n// Atendimentos is chronological: one line per day. Serviços is the running\n// balance per procedure, which is the question the counter actually gets —\n// *how many sessions of this did she buy, and how many are left*. Summing that\n// by eye across a 171-line history is not a thing anyone does, so nobody did:\n// the answer was in the database and out of reach.\n//\n// It also surfaces what every chronological view drops: a package bought with\n// no date yet has no booking, so it never appears in the history — 7,358 such\n// sessions in this tenant.\n// ---------------------------------------------------------------------------\n\nexport function PersonServicesWidget({ personId }: { personId: string }) {\n const provider = useAgendaProvider()\n const [rows, setRows] = React.useState<PersonServiceBalance[] | null>(null)\n\n React.useEffect(() => {\n let alive = true\n ;(async () => {\n try {\n const r = await provider.getPersonServiceBalance?.(personId)\n if (alive) setRows(r ?? [])\n } catch { if (alive) setRows([]) }\n })()\n return () => { alive = false }\n }, [personId, provider])\n\n if (rows === null) {\n // Skeleton shaped like the row that is coming — name on the left, three\n // counters on the right — so the list does not reflow when it lands.\n return (\n <ul className=\"space-y-2\" aria-busy=\"true\">\n {[0, 1, 2, 3].map((i) => (\n <li key={i} className=\"flex items-center gap-3 rounded-xl border px-3 py-2.5\">\n <div className=\"h-4 w-4 shrink-0 animate-pulse rounded bg-muted\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div className=\"h-3.5 w-44 animate-pulse rounded bg-muted\" />\n <div className=\"h-2.5 w-28 animate-pulse rounded bg-muted/70\" />\n </div>\n <div className=\"h-5 w-16 shrink-0 animate-pulse rounded-full bg-muted/70\" />\n </li>\n ))}\n </ul>\n )\n }\n\n if (!rows.length) {\n return (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">\n Esta pessoa ainda não tem serviço registrado nesta unidade.\n </p>\n )\n }\n\n const owed = rows.reduce((t, r) => t + r.pending, 0)\n\n return (\n <div className=\"space-y-3\">\n {/* The headline answers the counter's question before any scrolling. */}\n {owed > 0 && (\n <p className=\"rounded-xl bg-warning/10 px-3 py-2 text-xs text-warning-foreground\">\n {owed === 1 ? '1 sessão contratada e ainda não executada.' : `${owed} sessões contratadas e ainda não executadas.`}\n </p>\n )}\n\n <ul className=\"space-y-2\">\n {rows.map((r) => (\n <li\n key={r.serviceId ?? r.serviceName}\n className=\"flex items-start gap-3 rounded-xl border border-border bg-card px-3 py-2.5\"\n >\n <Layers className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{r.serviceName}</p>\n <p className=\"mt-0.5 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[11px] text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Check className=\"h-3 w-3 shrink-0 text-success\" aria-hidden />\n {r.executed} executada{r.executed === 1 ? '' : 's'}\n </span>\n {r.revisions > 0 && (\n <span className=\"inline-flex items-center gap-1\">\n <RotateCcw className=\"h-3 w-3 shrink-0\" aria-hidden />\n {r.revisions} revisã{r.revisions === 1 ? 'o' : 'es'}\n </span>\n )}\n {r.lastExecutedAt && (\n <span>última em {new Date(r.lastExecutedAt).toLocaleDateString('pt-BR')}</span>\n )}\n </p>\n </div>\n {/* Only what is OWED gets a badge. A badge on every row turns the\n one number that requires action into wallpaper. */}\n {r.pending > 0 && (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-warning/15 px-2 py-0.5 text-[10px] font-medium text-warning-foreground\">\n <CircleDashed className=\"h-3 w-3\" aria-hidden />\n {r.pending} a executar\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { usePluginPrefs } from '@fayz-ai/admin';
2
+
3
+ // src/hooks/useAgendaSettings.ts
4
+ var DEFAULTS = {
5
+ startTime: "07:00",
6
+ endTime: "21:00"
7
+ };
8
+ function useAgendaSettings() {
9
+ const prefs = usePluginPrefs("agenda", DEFAULTS);
10
+ return {
11
+ startTime: prefs.get("startTime"),
12
+ endTime: prefs.get("endTime"),
13
+ setStartTime: (v) => prefs.set("startTime", v),
14
+ setEndTime: (v) => prefs.set("endTime", v)
15
+ };
16
+ }
17
+
18
+ export { useAgendaSettings };
19
+ //# sourceMappingURL=chunk-37INOUNW.js.map
20
+ //# sourceMappingURL=chunk-37INOUNW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useAgendaSettings.ts"],"names":[],"mappings":";;;AAEA,IAAM,QAAA,GAAW;AAAA,EACf,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAA,EAAU,QAAQ,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AAAA,IAChC,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAA,IAC5B,cAAc,CAAC,CAAA,KAAc,KAAA,CAAM,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,IACrD,YAAY,CAAC,CAAA,KAAc,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC;AAAA,GACnD;AACF","file":"chunk-37INOUNW.js","sourcesContent":["import { usePluginPrefs } from '@fayz-ai/admin'\n\nconst DEFAULTS = {\n startTime: '07:00',\n endTime: '21:00',\n}\n\nexport function useAgendaSettings() {\n const prefs = usePluginPrefs('agenda', DEFAULTS)\n\n return {\n startTime: prefs.get('startTime'),\n endTime: prefs.get('endTime'),\n setStartTime: (v: string) => prefs.set('startTime', v),\n setEndTime: (v: string) => prefs.set('endTime', v),\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ // src/lib/tenant.ts
2
+ var t;
3
+ function setAgendaTenantId(id) {
4
+ t = id;
5
+ }
6
+ function getAgendaTenantId() {
7
+ return t;
8
+ }
9
+
10
+ export { getAgendaTenantId, setAgendaTenantId };
11
+ //# sourceMappingURL=chunk-A2VD5DVN.js.map
12
+ //# sourceMappingURL=chunk-A2VD5DVN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/tenant.ts"],"names":[],"mappings":";AAAA,IAAI,CAAA;AACG,SAAS,kBAAkB,EAAA,EAAuB;AAAE,EAAA,CAAA,GAAI,EAAA;AAAG;AAC3D,SAAS,iBAAA,GAAwC;AAAE,EAAA,OAAO,CAAA;AAAE","file":"chunk-A2VD5DVN.js","sourcesContent":["let t: string | undefined\nexport function setAgendaTenantId(id: string | undefined){ t = id }\nexport function getAgendaTenantId(): string | undefined { return t }\n"]}