# Arquitectura actual

> Actualización 2026-10-23: esta sección prevalece sobre las notas históricas del resto del archivo.

## Estado técnico vigente

- PHP 7.4+ con MVC ligero y PDO MySQL; no se utiliza framework, Composer ni npm.
- Entrada única: public/index.php. Apache reescribe hacia ese archivo mediante public/.htaccess.
- Rutas activas: /, /login, /logout, /tasks, /projects, /notes, /settings, /theme y /health.
- Controladores activos: AuthController, DashboardController, ProjectController, TaskController, NoteController y SettingsController.
- Datos: users, projects, project_members, project_invitations, tasks y notes. La columna users.upcoming_tasks_days se añade por migración.
- Cliente: CSS y JavaScript local. tasks.js administra tabla, búsqueda instantánea y modal; dashboard-links.js vuelve navegables las tarjetas de resumen.

## Flujo de próximas tareas

DashboardController obtiene el valor individual users.upcoming_tasks_days y lo entrega a DashboardData. La consulta muestra todas las tareas pendientes accesibles con due_date entre hoy y hoy + N días. No se limita el número de tareas; las vencidas o sin fecha no pertenecen al bloque.

## Módulo Configuración

SettingsController valida sesión y CSRF. Permite cambiar contraseña verificando la actual, evitando contraseña vacía y confirmando coincidencia. También persiste el rango de próximas tareas cuando la migración está aplicada.

## Deuda técnica conocida

Las vistas anteriores app/Views/dashboard/index.php y app/Views/tasks/index.php permanecen en el proyecto, pero no son las vistas activas. La vista de notas aún se genera desde un archivo compacto y NoteController inyecta en salida los enlaces laterales de Configuración, sincronización y cierre de sesión. Antes de una reescritura, preservar los formularios, tokens CSRF y permisos existentes.

Mi Panel usa una arquitectura MVC ligera, sin framework.

Flujo general:

Navegador -> public/index.php -> config/bootstrap.php -> Router -> Controller -> Model -> MySQL/MariaDB
                                                        Controller -> View PHP -> HTML + CSS

## Entrada y navegación

public/.htaccess redirige rutas no correspondientes a archivos físicos hacia public/index.php. El front controller registra rutas GET y POST en app/Core/Router.php.

Rutas principales: /login y /logout para autenticación, / para dashboard, /projects para proyectos y miembros, /tasks para tareas, /notes para notas, /settings para configuración, /theme para el tema y /health para una respuesta JSON.

## Componentes

Environment.php lee .env. Database.php crea PDO MySQL con excepciones, utf8mb4 y prepared statements nativos. Router.php contiene la tabla de rutas. Session.php gestiona cookie HttpOnly, SameSite Lax, modo estricto y timeout de dos horas. Auth.php mantiene la identidad autenticada. Csrf.php emite y valida tokens por sesión.

AuthController conecta login/logout con User. DashboardController carga identidad, tema y métricas. ProjectController aplica permisos de proyectos y miembros mediante Project. TaskController aplica permisos y conflictos de tareas; NoteController hace lo propio para notas; SettingsController modifica contraseña y rango de próximas tareas. Los modelos no usan ORM: ejecutan SQL parametrizado con PDO.

Las vistas PHP están en app/Views. No hay archivos .html estáticos. app.css contiene la base visual; projects.css, notes.css, tasks-table.css y settings.css contienen estilos específicos. dashboard-links.js y tasks.js aportan interacción local. No se cargan CDNs ni librerías externas.

## Datos

database/schema.sql define users, projects, project_members, project_invitations, tasks y notes. mi_panel.sql es otra exportación SQL con datos/estructura y no debe tratarse automáticamente como migración.

Las tareas y notas distinguen autor user_id de proyecto compartido project_id. Los proyectos y tareas usan borrado lógico con deleted_at. La tabla de invitaciones existe, pero su flujo no está implementado.

## Flujo de tareas

1. El usuario autenticado abre /tasks.
2. TaskController::index() consulta tareas accesibles.
3. El modelo filtra tareas privadas por autor y compartidas por propietario/membresía.
4. La vista genera formularios POST con CSRF.
5. El controlador verifica sesión, CSRF y permisos.
6. Completar/reabrir exige la versión enviada y devuelve 409 si ya cambió.

## Riesgos

- No existen pruebas automatizadas.
- Algunas vistas están comprimidas en una sola línea.
- Las vistas antiguas y algunas vistas activas siguen compactadas y hacen difícil su mantenimiento.
- La migración de la columna upcoming_tasks_days debe aplicarse en cada base existente.
- Hay rutas de roles que no cuentan con una interfaz de actualización completa.
- La cookie de sesión usa path=/.
