Hasta ahora el vínculo "esta hora/observación es de X" era por string
(h.abogado = users.name). Se rompía cuando un Socio renombraba un
usuario en el Panel de Control (las entradas históricas conservaban
el nombre viejo y los filtros del Reporte de Horas no las hallaban).
- Migración 014: ADD COLUMN user_id INT NULL + FK ON DELETE SET NULL
en ambas tablas, con backfill via JOIN users.name = abogado
- tramites/api.php: helper userIdByName() + add_obs/add_hours/
update_hours ahora persisten user_id junto con el string abogado
- horas/api.php: filtro WHERE (user_id = :uid OR (user_id IS NULL
AND abogado = :name)) — prioriza FK, cae al string solo para
filas legacy sin user_id. by_user y by_user_tramite agrupan por
COALESCE(u.name, h.abogado) para usar siempre el nombre actual.