Files
donna/sql/014_add_user_id_to_hours_obs.sql
Soporte ZH Consultores 0a8dc6fc46 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.
2026-06-04 22:33:41 -05:00

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;