# Módulo Resoluciones (integrado a IAM)

Repositorio de resoluciones de la facultad en PDF (escaneos antiguos y documentos nuevos) con tipos configurables
(CD, DEC, CSU y los que se agreguen), consulta por código y asignación de personas para que cada funcionario o
docente vea **sus** resoluciones. La sesión, los roles, los permisos, el menú y el diseño vienen de IAM.

## Requisitos
IAM instalado y actualizado (con `Layout` y `Modules`) · PHP 8.1+ · la misma base de datos de IAM.

## Instalación (XAMPP)
1. Copie esta carpeta a `C:\xampp\htdocs\resoluciones` (junto a `acceso`). Si IAM está en otra ruta, ajuste `iam_path` en `config/config.php`.
2. **Tablas:** en phpMyAdmin seleccione la base `iam_auth` → *Importar* → `database/install.sql`.
3. **Permisos:** `C:\xampp\php\php.exe bin\install.php` (registra `resoluciones.*` en IAM).
4. **Menú:** pegue el bloque de `iam-modules-entry.php` dentro del arreglo de `acceso\config\modules.php`.
5. Abra `http://localhost/resoluciones/public/` (el módulo aparece en la barra lateral de IAM).
6. En `C:\xampp\php\php.ini` (para escaneos y cargas masivas) y reinicie Apache:
   `upload_max_filesize=40M` · `post_max_size=256M` · `max_file_uploads=50` · `max_execution_time=300`
7. La carpeta `storage\files` debe poder escribirla el usuario del servidor web.

## Actualizar una instalación anterior (personas por C.I.)
1. Actualice el IAM y ejecute `php bin/upgrade.php --user=root --pass=` en la carpeta `acceso` (agrega la cédula a los usuarios).
2. En esta carpeta: `php bin/install.php --user=root --pass=` (crea la tabla de personas por C.I.). Alternativa: importe `database/upgrade-personas.sql` en phpMyAdmin (base `iam_auth`).
3. Para validar contra planillas, el usuario de BD de IAM necesita leer esa tabla: `GRANT SELECT ON planillas.docentes TO 'usuario'@'localhost';`
4. Cargue la **Cédula** de cada usuario en IAM → Usuarios → Editar.

## Permisos y roles sugeridos (se asignan en IAM → Roles)
| Permiso | Para qué |
|---|---|
| *(sin permiso)* | Cualquier usuario con sesión: **Mis resoluciones** y las **Generales** |
| `resoluciones.ver` | Ver y buscar **todas** las resoluciones (p. ej. rol «Consulta») |
| `resoluciones.cargar` | Cargar, editar, asignar personas, carga masiva (p. ej. rol «Secretaría») |
| `resoluciones.eliminar` | Eliminar resoluciones |
| `resoluciones.tipos` | Crear y editar tipos (CD, DEC, CSU, nuevos…) |

## Cómo se trabaja
- **Tipos:** *Tipos* → crear uno nuevo (código de 2 a 10 letras, p. ej. `RR`). Los tipos se desactivan, no se borran.
- **Cargar una resolución:** tipo + número + año generan el **código** (`CD-123-2024`, único). Se adjunta el PDF, la fecha, el asunto y las personas.
- **Personas de la resolución:** se pegan como figuran en ella, **una por línea con C.I., nombre y apellido** en cualquier orden
  (`1.234.567, Juan Carlos, Pérez Gómez` · `3456789 - María López` · `GONZÁLEZ, Ana - C.I. 2.345.678`, o columnas copiadas de Excel).
  La C.I. se valida contra `planillas.docentes` (config `personas_tabla`) y se guardan el nombre y apellido oficiales; una línea sin C.I. se busca por nombre y apellido.
  Las líneas con problemas se informan y vuelven al cuadro para corregirlas; las que no coinciden con planillas se avisan para revisar.
- **Quién ve «Mis resoluciones»:** el usuario de IAM cuya **Cédula** (campo del usuario en IAM → Usuarios) figura en la resolución, aunque el usuario se cree después.
  Sin cédula cargada en su usuario, la persona no ve las resoluciones en que figura.
- **Escaneos antiguos (carga masiva):** nombre cada archivo `TIPO-NÚMERO-AÑO.pdf` (`CD-123-2019.pdf`, `DEC_45_2020.pdf`, `CSU 12 2018.pdf`) y súbalos juntos. Quedan en **Por completar** hasta cargar fecha, asunto y personas desde *Editar*. Los duplicados y nombres no reconocidos se informan y se omiten.
- **Consulta:** buscador por código (`CD 123/2024`, `123/2024`), asunto, tipo, año y estado (vigente / modificada / derogada). Cada persona ve sus resoluciones y las generales; el PDF se abre en el navegador o se descarga, en cualquier dispositivo.

## Seguridad
- Los PDF se guardan **fuera de la web** con nombre aleatorio y solo se entregan por PHP tras validar sesión y acceso a *esa* resolución (ajena y privada = 404).
- Se valida que el archivo sea realmente un PDF y su tamaño; se guarda su huella SHA-256.
- Todo POST exige token CSRF; consultas preparadas; salida escapada; cada alta, edición, carga masiva y borrado queda en la auditoría de IAM.
- Quien no tiene permiso de ver todo solo ve las resoluciones en que figura o las marcadas como generales.

## Respaldos
Respalde la base de datos **y** la carpeta `storage/files` (son un conjunto).

## Fuera de alcance (extensiones naturales)
Aviso por correo a las personas asignadas, OCR para buscar dentro del texto del PDF, firma digital y versionado de resoluciones modificadas.
