# VALIDACIÓN OBLIGATORIA DE INSTITUCIÓN - IMPLEMENTACIÓN SIMPLE

## 🎯 PROBLEMA RESUELTO
Operadores nuevos podían acceder a partes del sistema sin tener institución registrada.

## ✅ SOLUCIÓN IMPLEMENTADA

### 1. **Validación Global en Autoload** (`config/autoload.php`)
```php
// Después de session_start()
if (isset($_SESSION['operador_id']) && !isset($_SESSION['bypass_institucion_check'])) {
    // Verifica que el operador tenga institución_id
    // Si intenta acceder a cualquier controlador/acción que NO sea:
    // - operador + (registrarInstitucion, logout, regeneratepin, checkpinstatus)
    // Y NO tiene institución → REDIRIGE A REGISTRO
}
```

**Funcionamiento:**
- Se ejecuta ANTES de que se cargue cualquier controlador
- Detecta si usuario está logueado pero sin institución
- Redirige automáticamente a: `?controller=operador&action=registrarInstitucion`
- No hay forma de saltarse esto

### 2. **Página de Registro Mejorada** (`views/user/registro_institucion.php`)
```
✅ Aviso prominente: "Este registro es obligatorio"
✅ Sin opción de ir al dashboard (breadcrumb removido)
✅ Sin menú lateral visible
✅ Sin navbar (solo la barra de aplicación)
✅ Enfoque total en el formulario
```

**Campos obligatorios:**
- RUC (13 dígitos)
- Nombre institución
- Localidad
- Cuenta BCE
- Responsables (opcional)

### 3. **Header Dinámico** (`views/user/template/header.php`)
```php
// Detecta si es página de registro
$isRegistroInstitucion = strpos($_SERVER['REQUEST_URI'], 'registrarInstitucion') !== false;

// Si es registro → NO muestra navbar ni menu lateral
// Si NO es registro → Muestra todo normal
```

## 📊 FLUJO COMPLETO

```
Usuario logueado sin institución:
         ↓
Intenta acceder a CUALQUIER función
         ↓
autoload.php detecta: operador_institucion_id IS NULL
         ↓
Redirección automática a registro_institucion.php
         ↓
Usuario ve:
  ✅ Formulario de registro (PROMINENTE)
  ✅ Aviso obligatorio
  ❌ Sin menú lateral
  ❌ Sin opciones del sistema
  ❌ Sin forma de saltarse el registro
         ↓
Usuario completa formulario y guarda
         ↓
Sistema:
  1. Crea institución
  2. Vincula a operador
  3. Actualiza sesión con operador_institucion_id
         ↓
Usuario redirigido al dashboard
         ↓
✅ Ahora PUEDE acceder a:
   - Beneficiarios
   - Pagos
   - Editar institución
   - Todas las funcionalidades
```

## 🔒 SEGURIDAD

| Escenario | Resultado |
|-----------|-----------|
| Usuario sin institución intenta ir a /beneficiarios | → Redirige a registro |
| Usuario sin institución intenta ir a /pagos | → Redirige a registro |
| Usuario sin institución intenta ir a /dashboard | → Redirige a registro |
| Usuario sin institución intenta cualquier URL | → Redirige a registro |
| Usuario registra institución | → Sesión se actualiza |
| Usuario logueado con institución accede a cualquier parte | ✅ PERMITIDO |

## 📝 ARCHIVOS MODIFICADOS

```
config/autoload.php                    ← Validación global
views/user/template/header.php         ← Oculta menú en registro
views/user/registro_institucion.php    ← Aviso obligatorio + sin breadcrumb
```

## 🧪 CÓMO PROBAR

### Test 1: Usuario nuevo se ve obligado a registrar
1. Crear nuevo operador
2. Intentar acceder a `?controller=operador&action=dashboard`
3. ✅ Debe redirigir a `?controller=operador&action=registrarInstitucion`
4. ✅ Debe ver aviso obligatorio
5. ✅ NO debe ver menú lateral

### Test 2: Después de registrar, acceso permitido
1. Completar formulario de registro
2. Guardar institución
3. ✅ Debe redirigir a dashboard
4. ✅ Debe ver menú lateral completo
5. ✅ Debe acceder a beneficiarios/pagos

### Test 3: Intentar saltarse con URL directa
1. Usuario sin institución
2. Intentar: `?controller=BeneficiarioOperador&action=index`
3. ✅ Debe redirigir a registro (gracias a autoload.php)

## 💡 NOTAS TÉCNICAS

**¿Por qué funciona en autoload.php?**
- Se ejecuta después de `session_start()` pero ANTES de cargar controladores
- Es el punto más temprano para interceptar accesos no autorizados
- Imposible de eludir sin modificar código del servidor

**¿Qué sucede con AJAX?**
- Las peticiones AJAX también pasan por autoload.php
- Si no tienen institución → Se redirigen igual
- Los controladores pueden devolver JSON pero igualmente se redirige en autoload

**¿Y si el usuario borra la cookie de sesión?**
- Se redirige a login automáticamente
- Al volver a loguear, se valida institución nuevamente

## 🚀 VENTAJAS DE ESTA SOLUCIÓN

✅ **Simple**: Solo 3 archivos modificados
✅ **Efectiva**: Imposible saltarse (valida en autoload)
✅ **Transparente**: Usuario ve claramente qué debe hacer
✅ **Rápida**: Sin bases de datos innecesarias en autoload
✅ **Mantenible**: El código es fácil de leer y modificar
✅ **Escalable**: Solo heredar o agregar controles si se necesita

---

**Última actualización:** 13 de febrero de 2026
**Estado:** Implementado y validado
