# Feriados e bloqueios de agenda

Antes de publicar os fontes, execute no banco de cada clinica a migration
`database/migrations/2026_09_10_bloqueios_agenda.sql`. Ela pode ser reexecutada.
Feriados antigos sem profissional continuam globais e de dia inteiro; um
profissional anteriormente selecionado e migrado para a nova tabela de vinculos.
Data final vazia recebe a inicial.

Em `/feriado`, cadastre a descricao, datas, horarios opcionais e marque um ou mais
profissionais. Sem profissionais selecionados, o bloqueio abrange todos os
profissionais do banco desta clinica. Os IDs sao os mesmos IDs de pessoa usados
em `agendamentos.especialista_id`; os vinculos ficam em `feriado_especialistas`.

Na tela `/agenda`, clicar em um horario vago oferece as opcoes de gerar um
contrato ou criar o bloqueio sem sair do calendario. O cadastro rapido preenche
a data e, na grade por horario, sugere um intervalo de uma hora. Se houver um
profissional no filtro, ele vem marcado, mas administradores podem escolher
varios profissionais ou o bloqueio global. Usuarios vinculados a especialista
so podem bloquear a propria agenda. Depois de salvar, os eventos do calendario
sao recarregados automaticamente, incluindo a cor configurada.

O intervalo de horas se repete diariamente, inclusive em fins de semana, entre as
datas inicial e final (inclusivas). Sem hora inicial, comeca a meia-noite;
sem hora final, termina na meia-noite seguinte. Sem ambas, ocupa o dia inteiro.
Horarios seguem o fuso da clinica. Intervalos que atravessam a meia-noite devem
ser divididos em dois bloqueios. Este cadastro nao implementa um intervalo
continuo com horarios diferentes no primeiro e no ultimo dia.

Uma sessao que termina exatamente no inicio do bloqueio ou comeca exatamente
no final e permitida. Qualquer sobreposicao parcial ou total e impedida no
servidor ao gerar ou remarcar sessoes, inclusive ao trocar o especialista.

Ao salvar um bloqueio com sessoes agendadas/confirmadas, o formulario mostra
pacientes, datas, horas e especialistas para revisao. E preciso confirmar
explicitamente; se os dados ou conflitos mudarem, sera exigida nova revisao.
As sessoes existentes nao sao canceladas automaticamente. Continua sendo
possivel cancelar essas sessoes, atualizar seu status sem remarcar, ou
remarca-las para um horario livre. Sessoes canceladas/realizadas nao entram
no alerta de pacientes aguardando atendimento.

A geracao de datas do contrato pula apenas bloqueios de dia inteiro que se
aplicam ao especialista selecionado. Bloqueios parciais sao verificados quando
os horarios das sessoes sao enviados. O calendario exibe as faixas bloqueadas
e identifica o especialista, respeitando o filtro de profissional.

Validacao local (PHP CLI, banco local com migration aplicada):
`php tests/bloqueios-agenda.php`. Os registros de teste ficam em uma transacao
revertida ao final; o script recusa conexoes configuradas para hosts remotos.
