feat(secretaria): agente/cérebro por número na aba Números #2

Merged
ruicesar merged 9 commits from feat/newwhats-satelite into main 2026-07-06 16:07:10 +02:00
Owner

Adiciona o seletor "Agente / Cérebro deste número" no NumbersPanel da Secretária: cada número de WhatsApp aponta para um agente (sec_numbers.agent_id), separando Secretária, nós do cérebro e agenda POR SESSÃO. Mostra o cérebro vinculado em cada card; tipos SecNumber.agent_id/CalendarSlot.instance_id + param instance_id no calendar.

Par do PR do motor (clube67_newwhats.local #20), que implementa o backend da separação por sessão.

🤖 Generated with Claude Code


Atualização (06/jul) — agenda inteligente + pendências do dono

  • /contexto (dentistas+especialidades+situações+cautelas) e /duvida; agenda_pedidos ganha tipo=duvida+resumo.
  • Situações da clínica (agenda_situacoes) + aba na UI de Horários.
  • Checklist do dono (checklist-defs.js + agenda_checklist): perguntas Sim/Não conferidas contra o banco (dentistas/pacientes) → pendências de config + cautelas p/ a IA. Trata telefone compartilhado e profissional não cadastrado.
  • Área de Pendências do dono (PendenciasDono.tsx): engloba config + fila operacional; botão+badge no /wa-secretaria (só o dono).
  • Fila humana (PedidosPendentes): cards de dúvida + resolver.
  • Desligar global da Secretária no ThinNav (visível a todos).

Commits novos: 40bed96, ec76dfe.

Adiciona o seletor "Agente / Cérebro deste número" no NumbersPanel da Secretária: cada número de WhatsApp aponta para um agente (`sec_numbers.agent_id`), separando Secretária, nós do cérebro e agenda POR SESSÃO. Mostra o cérebro vinculado em cada card; tipos `SecNumber.agent_id`/`CalendarSlot.instance_id` + param `instance_id` no calendar. Par do PR do motor (clube67_newwhats.local #20), que implementa o backend da separação por sessão. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- ### Atualização (06/jul) — agenda inteligente + pendências do dono - `/contexto` (dentistas+especialidades+situações+cautelas) e `/duvida`; `agenda_pedidos` ganha `tipo=duvida`+`resumo`. - **Situações da clínica** (`agenda_situacoes`) + aba na UI de Horários. - **Checklist do dono** (`checklist-defs.js` + `agenda_checklist`): perguntas Sim/Não conferidas contra o banco (dentistas/pacientes) → pendências de config + cautelas p/ a IA. Trata telefone compartilhado e profissional não cadastrado. - **Área de Pendências do dono** (`PendenciasDono.tsx`): engloba config + fila operacional; botão+badge no `/wa-secretaria` (só o dono). - **Fila humana** (`PedidosPendentes`): cards de dúvida + resolver. - **Desligar global** da Secretária no ThinNav (visível a todos). Commits novos: `40bed96`, `ec76dfe`.
ruicesar added 1 commit 2026-07-05 19:59:00 +02:00
Adiciona o seletor "Agente / Cérebro deste número" no NumbersPanel: cada
número de WhatsApp passa a apontar para um agente (sec_numbers.agent_id),
tornando a Secretária, os nós do cérebro e a agenda separados POR SESSÃO.
Mostra o cérebro vinculado em cada card; tipos SecNumber.agent_id e
CalendarSlot.instance_id + param instance_id no calendar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 01:23:36 +02:00
A Secretária passa a saber quando a clínica está aberta e a NÃO oferecer
horário/agendar em dia fechado (domingo, fora do horário, feriado).

- feriados.js: feriados nacionais BR (fixos + móveis via Páscoa) + resolver
  com exceções da clínica.
- agenda-schema.js: tabelas clinicas_horarios (horário do dono) e feriados
  (exceções/fechamentos), idempotentes.
- agenda-config.js: CRUD com ownership (horário/feriado da clínica = dono;
  horário do dentista = ele mesmo ou o dono), em /api/nw/agenda-config.
- agenda-bridge.js: GET /status (aberto hoje?, motivo, próximo aberto, grade,
  feriados) + /slots agora = clínica ∩ dentista − feriado.
- HorariosConfig.tsx + botão no AgendaSettingsModal: telas de configuração
  (abas Clínica e Dentistas).

Testado em dev: a Secretária ofereceu "amanhã" ao pedirem "hoje" num domingo,
com os horários configurados da clínica.

Obs.: index.js também traz trabalho acumulado do satélite (proxy de mídia via
Wasabi/storage) que estava no working tree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 02:12:54 +02:00
A — Folga/férias do dentista por DATA: tabela dentistas_folgas; o dentista (ou o
dono) marca dias em que não atende; o /slots pula o dentista nessas datas.
Endpoints /dentista/:id/folgas (GET/POST/DELETE) + UI na aba Dentistas.

B — Salas alugadas: o dentista com sala_reserva aprovada passa a ter horários
oferecidos pela Secretária no quarto (disponibilidade = janela da reserva,
casada pelo usuario_id). /slots ganha passada de salas (slot com sala_id +
local); /book grava agendamentos.sala_id (coluna aditiva). Geração passa a usar
CANDIDATE_CAP e ordena por horário (clínica e salas competem).

Testado em dev: folga pula os dias do dentista; reserva de sala gera slots com o
nome da sala.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 04:44:45 +02:00
- TZ=America/Sao_Paulo no backend (compose): a agenda deixa de rodar em UTC —
  horários/slots passam a ser Brasília automaticamente (corrige deslocamento de 3h).
- Acesso do DENTISTA: novo botão "Meus Horários" na agenda do dentista, abrindo
  a config direto nos horários/folgas DELE (HorariosConfig com initialTab/soDentista,
  restrito ao próprio registro). Antes só admin/donoclinica alcançavam a config.
- Config da clínica: gate passa a incluir donoconsultorio (dono de consultório).

Obs.: AgendaView.tsx também traz trabalho acumulado da agenda que estava no
working tree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 05:29:33 +02:00
- Duplicar horário para todos os dias (botão na grade).
- Janela do dentista com DOIS limites: "IA agenda livre" [inicio,fim] e "aceito
  confirmar também" (mais cedo/mais tarde) — colunas hora_inicio_flex/hora_fim_flex.
- Zona cinza: quando o cliente pede um horário fora da janela livre, a Secretária IA
  NÃO agenda — registra um pedido (POST /pedido) e diz "vou confirmar e retorno".
- Fila da secretária humana: tabela agenda_pedidos + endpoints (listar/confirmar/
  recusar); tela PedidosPendentes (confirmar → vira agendamento real, com escolha do
  dentista); botão com BADGE de contagem na Agenda (poll a cada 30 min) para staff.

Testado em dev: dentista configura flex; IA registra pedido de 8h30 e responde "vou
verificar com a secretária"; humana confirma → agendamento criado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 05:59:37 +02:00
- Espaçamento/duração padrão do slot passa de 30 para 60 min (1h entre atendimentos).
- /slots aceita ?periodo=manha|tarde (a Secretária pergunta o período antes de oferecer
  e busca só aquele período).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 1 commit 2026-07-06 06:31:41 +02:00
Endpoint para a Secretária IA acionar o dentista responsável num encaixe sub-hora.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar added 2 commits 2026-07-06 16:03:37 +02:00
Satélite da Secretária IA:
- /contexto (dentistas+especialidades+situações+cautelas) e /duvida (encaminhar
  ao humano sem agendar); agenda_pedidos ganha tipo=duvida + resumo.
- Situações da clínica: tabela agenda_situacoes + config (dono) + aba na UI.
- Checklist do dono (checklist-defs.js + agenda_checklist): perguntas Sim/Não
  conferidas contra o banco (dentistas/pacientes) → pendências de config +
  cautelas p/ a IA não chutar.
- Área de PENDÊNCIAS DO DONO (PendenciasDono.tsx): engloba config + fila
  operacional (horários/dúvidas); botão+badge no /wa-secretaria (só o dono).
- Fila humana (PedidosPendentes): cards de dúvida + resolver; /resolver.
- Botão DESLIGAR global da Secretária no ThinNav (secPowerApi, visível a todos).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fecha furos de identificação relatados:
- Telefone compartilhado na família: nova pergunta telefone_compartilhado +
  cautelas IDENTIDADE/TELEFONE COMPARTILHADO — a IA nunca assume quem fala pelo
  número (ex.: cadastrado no filho, mas quem fala é a mãe; ou pergunta do marido)
  e confirma nome + para quem é antes de agendar; se não bater, encaminha ao humano.
- Profissional não cadastrado: cautela para citações de dentista fora da lista
  (ex.: prótese com Dr. de fora) — encaminha ao humano e pede no resumo que o
  dono cadastre o profissional.
- Pendência de config quando telefone_compartilhado=Sim (completar cadastro dos familiares).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ruicesar merged commit 30ea2f0e10 into main 2026-07-06 16:07:10 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ruicesar/scoreodonto.com#2