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:
@@ -333,6 +333,33 @@ describe('selectPaciente / clearPaciente', () => {
|
||||
expect(composer.form.value.paciente_id).toBe(null);
|
||||
});
|
||||
|
||||
it('selectPaciente copia status pro form quando Ativo', () => {
|
||||
const composer = makeComposer();
|
||||
const { selectPaciente } = setup({ composer });
|
||||
selectPaciente({ id: 'p-1', nome: 'Ana', status: 'Ativo' });
|
||||
expect(composer.form.value.paciente_id).toBe('p-1');
|
||||
expect(composer.form.value.paciente_status).toBe('Ativo');
|
||||
});
|
||||
|
||||
it('selectPaciente bloqueia paciente Arquivado (defesa em camadas)', () => {
|
||||
const composer = makeComposer();
|
||||
const { selectPaciente, pacientePickerOpen } = setup({ composer });
|
||||
pacientePickerOpen.value = true;
|
||||
selectPaciente({ id: 'p-arq', nome: 'Ana', status: 'Arquivado' });
|
||||
// Form nao deve ter sido tocado
|
||||
expect(composer.form.value.paciente_id).toBe(null);
|
||||
expect(composer.form.value.paciente_status).toBeFalsy();
|
||||
// Picker permanece aberto pro user escolher outro
|
||||
expect(pacientePickerOpen.value).toBe(true);
|
||||
});
|
||||
|
||||
it('selectPaciente bloqueia paciente Inativo', () => {
|
||||
const composer = makeComposer();
|
||||
const { selectPaciente } = setup({ composer });
|
||||
selectPaciente({ id: 'p-ina', nome: 'Bruno', status: 'Inativo' });
|
||||
expect(composer.form.value.paciente_id).toBe(null);
|
||||
});
|
||||
|
||||
it('clearPaciente limpa form + samePatientConflict', () => {
|
||||
const composer = makeComposer({
|
||||
formExtra: { paciente_id: 'p-1', paciente_nome: 'Ana', paciente_avatar: 'url' }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user