70 lines
2.8 KiB
SQL
70 lines
2.8 KiB
SQL
-- 004_create_planes.sql
|
|
-- Creación de tabla planes para estructura de Ámbitos y Planes (ADN)
|
|
-- Reemplaza el concepto anterior de "fases" por "planes" dentro de cada ámbito
|
|
|
|
DO $$
|
|
BEGIN
|
|
-- Agregar columna 'codigo' a ambitos si no existe
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_schema = 'bitacoras' AND table_name = 'ambitos' AND column_name = 'codigo'
|
|
) THEN
|
|
ALTER TABLE bitacoras.ambitos ADD COLUMN codigo VARCHAR(10);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_ambitos_codigo ON bitacoras.ambitos(codigo);
|
|
END IF;
|
|
|
|
-- Crear tabla planes (dentro de un ámbito)
|
|
CREATE TABLE IF NOT EXISTS bitacoras.planes (
|
|
id SERIAL PRIMARY KEY,
|
|
ambito_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE CASCADE,
|
|
codigo VARCHAR(20) NOT NULL, -- Ej: 'A04.P001'
|
|
titulo VARCHAR(200) NOT NULL,
|
|
descripcion TEXT,
|
|
estado VARCHAR(10) DEFAULT '⏳', -- ⏳ Pendiente, ✅ Completado, ⏸️ Pausado, 🔴 Bloqueado
|
|
fecha_inicio DATE,
|
|
fecha_fin DATE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(ambito_id, codigo)
|
|
);
|
|
|
|
-- Índices para planes
|
|
CREATE INDEX IF NOT EXISTS idx_planes_ambito ON bitacoras.planes(ambito_id);
|
|
CREATE INDEX IF NOT EXISTS idx_planes_codigo ON bitacoras.planes(codigo);
|
|
CREATE INDEX IF NOT EXISTS idx_planes_estado ON bitacoras.planes(estado);
|
|
|
|
-- Modificar tabla hitos: añadir plan_id (reemplaza fase_id)
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_schema = 'bitacoras' AND table_name = 'hitos' AND column_name = 'plan_id'
|
|
) THEN
|
|
ALTER TABLE bitacoras.hitos
|
|
ADD COLUMN plan_id INTEGER REFERENCES bitacoras.planes(id) ON DELETE SET NULL;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_hitos_plan ON bitacoras.hitos(plan_id);
|
|
END IF;
|
|
|
|
-- Mantener fase_id por compatibilidad temporal (se deprecará en el futuro)
|
|
-- Los nuevos hitos deben usar plan_id
|
|
|
|
END $$;
|
|
|
|
-- Crear vista resumen_planes para métricas (fuera del bloque DO)
|
|
CREATE OR REPLACE VIEW bitacoras.resumen_planes AS
|
|
SELECT
|
|
p.id AS plan_id,
|
|
p.codigo,
|
|
p.titulo,
|
|
p.estado,
|
|
a.nombre AS ambito_nombre,
|
|
COUNT(h.id) AS total_hitos,
|
|
COUNT(CASE WHEN h.estado = '✅' THEN 1 END) AS hitos_completados,
|
|
COALESCE(SUM(h.horas_presencial), 0) AS total_horas_presencial,
|
|
COALESCE(SUM(h.horas_remoto), 0) AS total_horas_remoto,
|
|
MIN(h.fecha) AS fecha_inicio_real,
|
|
MAX(h.fecha) AS fecha_fin_real
|
|
FROM bitacoras.planes p
|
|
LEFT JOIN bitacoras.ambitos a ON p.ambito_id = a.id
|
|
LEFT JOIN bitacoras.hitos h ON p.id = h.plan_id
|
|
GROUP BY p.id, p.codigo, p.titulo, p.estado, a.nombre;
|