# Fase 5 — Gating de módulos (habilitar/deshabilitar por colegio)

## Objetivo
Mostrar y permitir solo los módulos habilitados para el colegio activo, leyendo de `siscev.colegio_modulos`. Aplica al sidebar y a cada módulo.

## Dependencias
Fase 1 (tablas `modulos`, `colegio_modulos`), Fase 3 (tenant), Fase 4 (config).

## Tareas

1. **`core/modulos.php`**:
   - `cargar_modulos(int $idColegio): void` — carga a `$_SESSION['modulos']` el set de slugs habilitados (JOIN `modulos` + `colegio_modulos WHERE habilitado=1`). Cachear en sesión para no consultar en cada request.
   - `modulo_habilitado(string $slug): bool`.
   - `requiere_modulo(string $slug): void` — si no habilitado → `header("Location: home.php"); exit;` (o página "módulo no disponible").
   - `config_modulo(string $slug, string $clave, $default=null)` — lee de `colegio_modulo_config` (la config interna de cada módulo).
   - Llamar `cargar_modulos()` desde `bootstrap.php`.

2. **Guard en cada módulo**: insertar al inicio (tras el bootstrap) la llamada `requiere_modulo('<slug>')`. Ej.: `boletin.php` → `requiere_modulo('boletin')`.

3. **Sidebar en `layout/base.php`**: envolver cada item/grupo del menú con `modulo_habilitado('<slug>')`. Si un grupo entero queda vacío (todos sus módulos OFF), no pintar el encabezado del grupo. Mantener la lógica condicional por grado existente (sección 35 de la referencia) **además** del gating.

4. **Config interna por módulo** — definir, por cada módulo que la necesite, sus claves. Ejemplos:
   - `registrar-pago`: bancos activos, correo de notificación.
   - `boletin`/`corte-notas`: rango de grados, plantilla PDF.
   - `chat-docentes`: activar/desactivar adjuntos.
   Documentar el catálogo de claves por módulo (lo consumirá el panel admin en Fase 6).

## Criterio de aceptación
- Deshabilitar `boletin` para el piloto → desaparece del sidebar y entrar a `boletin.php` directo redirige.
- Habilitarlo → reaparece y funciona.
- Un grupo de menú sin módulos habilitados no muestra su encabezado.
- `config_modulo('registrar-pago','correo_notif')` devuelve el valor configurado.
