agenda: pacientes arquivados/inativos visiveis e bloqueados no picker

AgendaEventDialogV2.filteredPatients agora mostra TODOS os pacientes
(antes filtrava status='Ativo' silenciosamente), ordenados Ativo > Inativo
> Arquivado. Items nao-Ativo vem com Tag colorida + disabled + tooltip
explicativo — UX clara: o paciente aparece (user nao "perde" no search)
mas nao da pra agendar.

selectPaciente bloqueia non-Ativo (defesa em camadas: template ja marca
disabled, mas se alguem chamar a funcao programaticamente por cache stale
etc, a regra continua valendo). Copia status pro form pra canSave aplicar
getPatientAgendaPermissions corretamente.

3 specs novas em useAgendaEventPickerBilling.spec cobrem o bloqueio +
copia do status.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-11 10:45:57 -03:00
parent 8e3c09d1b1
commit 8f4e6679eb
3 changed files with 62 additions and 8 deletions
@@ -286,9 +286,18 @@ export function useAgendaEventPickerBilling({
function selectPaciente(p) {
if (!p?.id) return;
// Bloqueia clique em paciente arquivado/inativo — defesa em camadas:
// o template do picker ja marca esses items como disabled, mas se
// alguem chamar selectPaciente programaticamente (cache stale, etc),
// a regra precisa valer.
if (p.status && p.status !== 'Ativo') return;
composer.form.value.paciente_id = p.id;
composer.form.value.paciente_nome = p.nome || '';
composer.form.value.paciente_avatar = p.avatar_url || '';
// Sem isso, form.paciente_status fica '' e canSave nao consegue
// aplicar getPatientAgendaPermissions — qualquer falha do filtro
// acima vira sessao criavel com paciente fora do escopo.
composer.form.value.paciente_status = p.status || '';
pacientePickerOpen.value = false;
}
@@ -296,6 +305,7 @@ export function useAgendaEventPickerBilling({
composer.form.value.paciente_id = null;
composer.form.value.paciente_nome = '';
composer.form.value.paciente_avatar = '';
composer.form.value.paciente_status = '';
actions.samePatientConflict.value = null;
}