Opção (b) — mesma pessoa/número servindo a papéis diferentes, roteando por situação:
- GET /api/comunicacao/numero-lookup: ao digitar um número, avisa se ele já é de outra
conta/papel da clínica (ex.: número na conta dentista aparece ao editar a de dono).
Modal mostra banner "pode compartilhar — descreva as situações; a Secretária roteia".
- Bridge GET /contatos: agenda de contatos internos (nome, papel, situações de cada
número, janela atual) p/ a Secretária rotear por assunto. Não expõe o número cru.
Verificado E2E: lookup como dono acha o nº na conta dentista; /contatos lista papel+situações.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Gate progressivo: modal ganha "Lembrar mais tarde" e reaparece a cada login;
a partir da 4ª aparição vira bloqueio até preencher (contador em localStorage
por clínica; ref evita contagem dupla no StrictMode).
- Agenda passa a ser exigida/exibida só para DENTISTA (quem atende). Backend:
comunicacaoCompleto(p, ehDentista) via vinculos.role; GET devolve `role`.
Não-dentista (dono/funcionário) completa só com endereço + números.
Verificado: dono completa sem agenda; dentista exige agenda; role no GET ok.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Perfil sem endereço próprio → GET /api/comunicacao sugere o endereço já cadastrado
da clínica (só confirmar, não redigitar) + flag endereco_da_clinica. Modal mostra
aviso "puxamos o endereço da clínica — é só conferir". Resolve a fricção do dono,
cuja clínica já tem endereço.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Base da "comunicação interna": cada não-paciente (dentista/funcionário) cadastra
endereço, MÚLTIPLOS números de WhatsApp e a disponibilidade de agenda.
Backend:
- Tabela pessoa_comunicacao (usuario_id+clinica_id): endereco/numeros/agenda JSONB + completo.
- GET/PUT /api/comunicacao/:usuarioId ('me' = usuário atual). Autoriza self OU gestor
(dono/admin). Recalcula `completo` no PUT (regra: endereço + ≥1 número com descrição
e ≥1 janela de horário + agenda decidida; se aberta, exige ≥1 janela).
Frontend:
- ComunicacaoInternaModal (full-screen): Endereço (com ViaCEP), Números (cada um com
descrição + situações + janelas de horário permitido p/ a Secretária enviar msg),
Agenda (abrir/fechar + horários de atendimento). Editor de janelas reutilizável.
- Gate no App.tsx: todo não-paciente com clínica ativa cujo perfil está incompleto vê
o modal FORÇADO em todas as telas (espelha o gate de troca de senha) até completar.
Verificado E2E: PUT incompleto->completo=false; PUT completo->true; GET reflete.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>