# Módulo Calendario de Avisos y Eventos · UGV

Versión con **base de datos propia** y **administradores propios**.
No toca la base ni las tablas del control escolar.

## Archivos

| Archivo | Función |
|---|---|
| `schema_calendario.sql` | Crea la base `calendario_ugv`, sus tablas y el administrador inicial |
| `config_calendario.php` | ★ Único archivo que editas: credenciales y opciones |
| `api_calendario.php` | API: consulta, login, guardar, eliminar, cambiar contraseña |
| `calendario.php` | Página del calendario |
| `crear_admin.php` | Alta de administradores adicionales (eliminar después de usar) |

## Instalación

### 1. Crear la base de datos
En phpMyAdmin, pestaña **SQL**, pega el contenido de `schema_calendario.sql`
y ejecútalo. Esto crea:

- La base `calendario_ugv` (independiente del control escolar)
- La tabla `cal_administradores`
- La tabla `cal_eventos`
- Un administrador inicial:
  - **Usuario:** `admin`
  - **Contraseña:** `Admin2026$UGV`

> ⚠ Esa contraseña aparece en el archivo SQL, así que es pública.
> Cámbiala en cuanto entres (botón «Cambiar contraseña»).

Al final del archivo hay dos bloques comentados opcionales: crear un usuario
MySQL exclusivo del calendario y cargar eventos de ejemplo.

### 2. Configurar
Edita `config_calendario.php`:

```php
define('CAL_BD_USUARIO',    'cal_usuario');
define('CAL_BD_CONTRASENA', 'tu_contrasena');
define('CAL_CLAVE_INSTALACION', 'una-frase-larga-y-unica');
define('CAL_QUIEN_VE', 'sistema');   // o 'todos'
```

**`CAL_QUIEN_VE`** decide quién puede *ver* el calendario:

- `'sistema'` → solo usuarios con sesión iniciada en el control escolar.
  Ajusta también `CAL_VAR_SESION_SISTEMA` (la variable que tu login guarda,
  p. ej. `usuario_id`) y `CAL_URL_LOGIN_SISTEMA` (ruta de tu login).
- `'todos'` → cualquiera puede consultarlo, sin sesión.

Editar **siempre** requiere iniciar sesión como administrador del calendario,
sin importar esta opción.

### 3. Subir los archivos
Copia los archivos PHP a una carpeta del servidor, por ejemplo
`control_escolar/calendario/`, y agrega el enlace en tu menú:

```html
<a href="calendario/calendario.php">Calendario de avisos y eventos</a>
```

### 4. Crear tus administradores
Dos caminos:

**A) Desde el navegador (recomendado)**
Abre `crear_admin.php`, escribe la clave de instalación y da de alta a cada
persona. También muestra la lista de administradores y su último acceso.
**Elimina el archivo del servidor al terminar.**

**B) Por SQL**
Las contraseñas deben ir como hash bcrypt, nunca en texto plano. Genera el
hash con PHP y luego insértalo:

```php
<?php echo password_hash('LaContrasenaQueQuieras', PASSWORD_DEFAULT); ?>
```

```sql
INSERT INTO cal_administradores (usuario, nombre, contrasena)
VALUES ('jperez', 'Juan Pérez', '$2y$10$elHashQueGeneraste...');
```

### 5. Asegurar
- Entra al calendario y cambia la contraseña del usuario `admin`.
- O desactívalo cuando ya tengas tu propio usuario:
  ```sql
  UPDATE cal_administradores SET activo = 0 WHERE usuario = 'admin';
  ```
- Elimina `crear_admin.php` del servidor.
- Cuando el sitio use HTTPS, descomenta `'secure' => true` en
  `config_calendario.php`.

## Comportamiento

| Usuario | Ve el calendario | Botones de edición | La API acepta escritura |
|---|---|---|---|
| Sin sesión (modo `sistema`) | No, va al login | — | No (401) |
| Usuario del sistema | Sí, solo consulta | No aparecen | No (401) |
| Administrador del calendario | Sí | Sí | Sí |

La restricción real vive en el servidor: `api_calendario.php` verifica la
sesión y un token anti-CSRF en cada escritura. Ocultar los botones es solo
cortesía visual.

## Gestión de administradores

```sql
-- Ver quién tiene acceso
SELECT usuario, nombre, activo, ultimo_acceso FROM cal_administradores;

-- Suspender temporalmente (sin borrar su historial)
UPDATE cal_administradores SET activo = 0 WHERE usuario = 'jperez';

-- Reactivar
UPDATE cal_administradores SET activo = 1 WHERE usuario = 'jperez';
```

Cada evento guarda en `creado_por` quién lo registró y en `editado_en` la
fecha de la última modificación.

## Nota sobre la sesión

El módulo usa un nombre de sesión propio (`CALUGVSESS`), así que iniciar o
cerrar sesión en el calendario no afecta la sesión del control escolar,
aunque compartan servidor.
