refactor(hours): FK user_id en tramites_hours y tramites_obs
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.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
-- ============================================================
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user