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.
43 lines
1.6 KiB
SQL
43 lines
1.6 KiB
SQL
-- ============================================================
|
|
-- Donna — Schema 014: FK user_id en tramites_hours y tramites_obs
|
|
-- ============================================================
|
|
-- Hasta ahora el vínculo "esta hora/observación es de Fulanito"
|
|
-- se hacía por string (h.abogado = users.name). Eso rompe cuando:
|
|
-- - Hay variantes legacy (parcial vs completo) → ya arreglado en 013
|
|
-- - Un Socio renombra al usuario en el Panel de Control (las
|
|
-- entradas históricas conservan el nombre viejo y los filtros
|
|
-- no las encuentran al buscar por el nuevo nombre)
|
|
--
|
|
-- Esta migración agrega user_id INT NULL con FK a users(id) y
|
|
-- ON DELETE SET NULL (si borran al usuario, la entrada queda con
|
|
-- user_id NULL pero conserva el string `abogado` como historia).
|
|
-- El backfill solo asocia donde hay match exacto y único.
|
|
|
|
-- 1. tramites_hours
|
|
ALTER TABLE tramites_hours
|
|
ADD COLUMN IF NOT EXISTS user_id INT NULL AFTER abogado,
|
|
ADD INDEX IF NOT EXISTS idx_user_id (user_id);
|
|
|
|
UPDATE tramites_hours h
|
|
JOIN users u ON u.activo = 1 AND u.name = h.abogado
|
|
SET h.user_id = u.id
|
|
WHERE h.user_id IS NULL;
|
|
|
|
ALTER TABLE tramites_hours
|
|
ADD CONSTRAINT fk_hours_user
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
|
|
|
|
-- 2. tramites_obs
|
|
ALTER TABLE tramites_obs
|
|
ADD COLUMN IF NOT EXISTS user_id INT NULL AFTER abogado,
|
|
ADD INDEX IF NOT EXISTS idx_user_id (user_id);
|
|
|
|
UPDATE tramites_obs o
|
|
JOIN users u ON u.activo = 1 AND u.name = o.abogado
|
|
SET o.user_id = u.id
|
|
WHERE o.user_id IS NULL;
|
|
|
|
ALTER TABLE tramites_obs
|
|
ADD CONSTRAINT fk_obs_user
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
|