# ClaseOnline - Proyecto PHP MVC
**Hector Vega Olivar - DAW 2025-2026**

## Instalacion

1. Importar `claseonline_db.sql` en phpMyAdmin
2. Copiar la carpeta `claseonline/` a `htdocs/` (XAMPP)
3. Editar `config/config.php` si es necesario cambiar credenciales de BD
4. Acceder a: http://localhost/claseonline/public

## Credenciales de prueba

| Usuario       | Contrasena  | Rol           |
|---------------|-------------|---------------|
| admin         | Admin@1234  | Administrador |
| maria_garcia  | Alumno@1234 | Alumno        |
| juan_lopez    | Alumno@1234 | Alumno        |

## Estructura MVC (patron Shareboard - Eduonix)

```
claseonline/
├── config/config.php           <- DB_HOST, DB_NAME, URLROOT, PER_PAGE
├── core/
│   ├── Database.php            <- abstract class Model (PDO + SET NAMES utf8)
│   ├── Controller.php          <- Clase base: view(), model(), redirect(), requireAdmin()
│   └── App.php                 <- Router URL -> Controlador -> Metodo
├── public/
│   ├── index.php               <- Punto de entrada unico
│   ├── .htaccess               <- Reescritura de URLs
│   └── css/custom.css
├── app/
│   ├── controllers/
│   │   ├── PagesController.php    <- Landing publica con paginacion
│   │   ├── CursosController.php   <- Explorar, detalle, inscribir
│   │   ├── UsuariosController.php <- Login, registro, logout, mis cursos
│   │   └── AdminController.php    <- CRUD cursos y profesores, asignacion
│   ├── models/
│   │   ├── UsuarioModel.php       <- registrar(), login() con password_hash
│   │   ├── CursoModel.php         <- CRUD, busqueda, inscripciones, stats
│   │   └── ProfesorModel.php      <- CRUD, asignacion 1:1
│   └── views/
│       ├── inc/ (header, footer, paginacion)
│       ├── pages/index.php
│       ├── cursos/ (index, show)
│       ├── usuarios/ (login, register, miscursos)
│       └── admin/ (cursos, crear_curso, editar_curso, profesores, crear_profesor, editar_profesor)
└── claseonline_db.sql
```

## Funcionalidades implementadas (RF)

| RF  | Descripcion                            | Implementacion                              |
|-----|----------------------------------------|---------------------------------------------|
| RF-1  | Acceso publico sin registro          | PagesController, CursosController (sin auth)|
| RF-2  | Explorar cursos paginados            | CursosController::index() + PER_PAGE        |
| RF-3  | Buscar/filtrar cursos                | Filtros: nombre, contenido, profesor, horas |
| RF-4  | Ver detalle de curso                 | CursosController::show()                    |
| RF-5  | Login diferenciado por rol           | loginPost() redirige segun rol              |
| RF-6  | Admin: crear curso                   | AdminController::crearCurso/storeCurso      |
| RF-7  | Admin: editar curso                  | AdminController::editarCurso/updateCurso    |
| RF-8  | Admin: eliminar curso                | AdminController::deleteCurso()              |
| RF-9  | Asignacion 1:1 profesor-curso        | UNIQUE KEY + validacion en CursoModel       |
| RF-10 | Gestionar asignacion profesores      | AdminController::asignarProfesor/quitar     |
| RF-11 | Registro alumno con validacion       | UsuariosController::register/registerPost   |
| RF-12 | Login alumno/admin                   | UsuariosController::login/loginPost         |
| RF-13 | Inscripcion en curso (alumno)        | CursosController::inscribir()               |
| RF-14 | Ver mis cursos con progreso          | UsuariosController::miscursos()             |

## Correcciones aplicadas

1. **SET NAMES utf8** en abstract class Model (exactamente como se indica en la entrega)
2. **ENUM 'Basico'** sin tilde en SQL y PHP para coherencia total (evita problemas de codificacion)
3. **Multiplicidad corregida**: alumno_id NOT NULL en tabla inscripciones (1 inscripcion = exactamente 1 alumno)
4. **Paginacion mejorada**: incluye botones Anterior/Siguiente y pasa filtros en query string
