Commit Graph

4 Commits

Author SHA1 Message Date
VPS 4 Builder b253feb4aa feat(comunicacao-interna): notificação de número compartilhado + agenda de contatos
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>
2026-07-07 22:48:42 +02:00
VPS 4 Builder 8b9776f081 feat(comunicacao-interna): gate progressivo + agenda só p/ dentista
- 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>
2026-07-07 20:40:54 +02:00
VPS 4 Builder 9fd078e36f feat(comunicacao-interna): pré-preenche endereço a partir da clínica
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>
2026-07-07 20:18:01 +02:00
VPS 4 Builder dcf33befec feat(comunicacao-interna): perfil de contato de não-pacientes + gate obrigatório
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>
2026-07-07 17:13:14 +02:00