# PROGRESS — Mi Panel

## Estado vigente para continuidad — 2026-10-23

La aplicación está funcional y se ejecuta localmente con WampServer, PHP 7.4+ y MySQL. Los módulos disponibles son Inicio, Tareas, Proyectos, Notas y Configuración. No usar los encabezados de fase antiguos de este archivo como estado actual: se conservan como historial.

### Implementado

- Login, cierre de sesión, sesiones, CSRF y límite de intentos.
- Tema claro/oscuro, dashboard con datos reales y recarga manual de datos locales.
- Proyectos, miembros, roles, archivado y restauración.
- Tareas: tabla responsive, búsqueda instantánea y GET de respaldo, detalle desplegable, modal de alta, edición, estado y borrado lógico.
- Notas: CRUD, fijado y borrado lógico.
- Configuración: cambio de contraseña y periodo individual para Próximas tareas.

### Bloqueo actual

La migración database/migrations/20261023_add_user_settings.sql necesita ejecutarse con root o un usuario MySQL con ALTER. El usuario de aplicación no tiene ni debe tener ese permiso. Mientras falte la migración, el dashboard usa 7 días y Configuración no permite guardar el rango.

### Próximo paso recomendado

1. Respaldar base de datos y aplicar la migración de Configuración.
2. Verificar Inicio, Tareas, Proyectos, Notas y Configuración en navegador y móvil.
3. Ejecutar tests/smoke.php con MySQL disponible para PHP CLI.
4. Realizar pruebas de permisos con al menos dos usuarios antes de nuevas funciones.

Consulta MIGRATION.md para trasladar el proyecto a otro equipo.

**Estado global:** Preparación documental completada; desarrollo de aplicación NO iniciado.  
**Entorno elegido:** Windows local + PHP 7.4+ + MySQL 8.0+.  
**Control de versiones:** Git no solicitado; no inicializar automáticamente.

## Fases
- [x] Aprobar prototipo del Dashboard.
- [x] Aprobar tema claro/oscuro y usuario visible.
- [x] Aprobar colaboración por proyecto completo (opción A).
- [x] Aprobar política de cero polling y bajo consumo de ancho de banda.
- [x] Preparar esquema SQL y documentos iniciales.
- [x] **Fase 0:** entorno, esquema y conexión PDO verificados.
- [x] **Fase 1:** bootstrap, autenticación, sesión/CSRF y pruebas de acceso completados.
- [x] **Fase 2:** Dashboard responsive, tema persistente y navegación visual completados.
- [ ] **Fase 3:** proyectos, miembros, invitaciones y matriz de permisos.
- [ ] **Fase 4:** CRUD tareas y notas, versiones y conflictos.
- [ ] **Fase 5:** búsqueda explícita, optimización, pruebas de seguridad y responsive.

## Próxima tarea exacta para Codex
1. Inspeccionar carpeta y documentos sin modificar ni borrar archivos existentes.
2. Detectar stack disponible en Windows; preguntar si faltan PHP, MySQL o Apache.
3. Confirmar ruta del proyecto y URL local antes de configurar virtual host.
4. Validar compatibilidad e importación de `database/schema.sql` en MySQL 8; proponer correcciones si hace falta.
5. Implementar **solo Fase 0 y bootstrap mínimo de Fase 1**, sin intentar todos los módulos a la vez.
6. Actualizar este archivo con cambios, pruebas ejecutadas, resultados y próximos pasos.

## Registro de trabajo
| Fecha | Etapa | Cambios | Pruebas | Estado |
|---|---|---|---|---|
| 2026-10-12 | Preparación | Arquitectura, SQL, estructura y guía para Codex | Verificación documental | Completado |
| 2026-10-12 | Fase 0 / bootstrap Fase 1 | Verificado WampServer y creado front controller, carga de entorno y PDO seguro | Lint PHP, carga de bootstrap, revisión SQL y sintaxis Apache correctos; HTTP bloqueado por PHP 7.4 | En curso |
| 2026-10-12 | Entorno local | Esquema importado, usuario SQL restringido, `.env` y virtual host preparados | MySQL/PDO y seis tablas correctos; Apache y hosts requieren aplicación administrativa | En curso |
| 2026-10-12 | Compatibilidad | Requisito y bootstrap adaptados a PHP 7.4+ | Sintaxis, PDO y rutas HTTP validadas con PHP 7.4.33 | Completado |
| 2026-10-13 | Fase 1 — autenticación | Sesión segura, CSRF, login/logout, control de intentos y cuenta inicial administrada | Lint PHP 7.4; login, acceso autenticado y logout correctos | Completado |
| 2026-10-13 | Fase 2 — interfaz | Dashboard responsive, navegación visual y tema persistente | Lint PHP 7.4 y render autenticado correctos | Completado |

### 2026-10-12 — Fase 0 / bootstrap mínimo de Fase 1
**Objetivo:**
Verificar el stack local, revisar estáticamente el esquema y preparar el arranque seguro sin implementar módulos funcionales.

**Archivos creados/modificados:**
- Creados: `app/Core/Environment.php`, `app/Core/Database.php`, `app/Core/Router.php`, `config/bootstrap.php`, `public/index.php` y `public/.htaccess`.
- Modificado: `PROGRESS.md`.

**Pruebas ejecutadas y resultado:**
- WampServer detectado en `C:\wamp64`; Apache 2.4.58 y servicio `wampmysqld64` están en ejecución.
- PHP 8.2.13 CLI probado con `PDO`, `pdo_mysql`, `openssl`, `mbstring` y `session` disponibles.
- Cliente MySQL 8.2.0 detectado; la consulta de versión al servidor fue rechazada por falta de contraseña para `root`.
- El esquema fue revisado estáticamente: contiene las seis tablas previstas, `utf8mb4`, InnoDB, llaves foráneas, índices y la restricción de fecha/hora. No se importó ni se modificó la base de datos.
- `php -l` con PHP 8.2.13 fue correcto en los cinco archivos PHP creados; la carga de `config/bootstrap.php` devolvió los servicios esperados.
- `httpd -t` devolvió `Syntax OK`. La petición a `http://localhost/miPanel/public/` devolvió HTTP 500 esperado con el aviso de que Apache usa PHP 7.4.33; no es apto todavía para servir la aplicación.
- MySQL 8.2.0 fue confirmado mediante conexión administrativa. `database/schema.sql` se importó en la nueva base `mi_panel`; se verificaron seis tablas y el usuario `mi_panel_app@127.0.0.1` cuenta únicamente con `SELECT`, `INSERT`, `UPDATE` y `DELETE` sobre `mi_panel`.
- La conexión PDO desde el bootstrap con PHP 8.2.13 fue correcta y confirmó seis tablas. `.env` existe solo en la raíz del proyecto y está cubierto por `.gitignore`.
- El virtual host `mi-panel.local` fue añadido con `DocumentRoot C:/wamp64/www/miPanel/public`; `httpd -t` continuó devolviendo `Syntax OK`.
- La configuración PHP 8.2 para Apache fue instalada sin sobrescribir un archivo existente y cargó correctamente `PDO`, `pdo_mysql`, `openssl` y `mbstring` mediante `php-cgi`.
- El bootstrap se adaptó a PHP 7.4.33: sintaxis correcta, PDO conectado a `mi_panel` con seis tablas y rutas HTTP comprobadas sin APIs exclusivas de PHP 8+.

**Decisiones:**
- El front controller se restringe a `public/` y usa reescritura local; no se modificó la configuración global de Apache ni se creó virtual host.
- PDO usa DSN `utf8mb4`, excepciones y sentencias preparadas nativas. Las credenciales se leen de variables de entorno o de `.env` local no versionado.
- Por decisión del usuario, Mi Panel se adapta a PHP 7.4+ para compartir el entorno WampServer 7.4.33 con otros proyectos. El bootstrap evita APIs exclusivas de PHP 8+ y mantiene PDO/MySQL y las medidas de seguridad compatibles.

**Problemas pendientes:**
- Faltan credenciales con privilegios para validar la versión del servidor MySQL e importar `database/schema.sql` en una base nueva con autorización explícita.
- Falta crear `.env` local con credenciales reales y configurar un virtual host cuyo DocumentRoot sea `C:\wamp64\www\miPanel\public`.
- Windows también rechazó la modificación de `C:\Windows\System32\drivers\etc\hosts`; falta añadir `127.0.0.1 mi-panel.local` desde un editor ejecutado como administrador.

**Próximo paso concreto:**

## Auditoría documental — 2026-10-14

### Estado actual

La aplicación es PHP MVC ligera con PDO y CSS local. No existen archivos JavaScript, HTML estático ni pruebas automatizadas.

### Funcionalidades terminadas

- Autenticación, sesión, CSRF y tema.
- Dashboard visual.
- Proyectos, miembros y roles básicos.
- Tareas: creación, listado, completar/reabrir y borrado lógico.

### Funcionalidades parciales o pendientes

- Notas aún no tienen CRUD.
- Tareas no tienen edición completa.
- Invitaciones/tokens fueron omitidos por decisión del usuario.
- Dashboard usa datos demostrativos.
- Búsqueda y pruebas automatizadas pendientes.

### Problemas y riesgos detectados

- README previo estaba desactualizado; fue reemplazado por documentación del estado real.
- Las vistas de dashboard y tareas están muy comprimidas.
- El formulario de tareas acepta project_id manualmente.
- La ruta de actualización de roles no tiene interfaz visible.
- Existen dos archivos SQL con propósitos similares; usar database/schema.sql como fuente principal y revisar mi_panel.sql antes de importarlo.

### Cambios de esta auditoría

Se crearon o actualizaron README.md, ARCHITECTURE.md, FUNCTIONS.md y CODEX.md. No se modificó código funcional.

### Mejoras recomendadas

1. Añadir pruebas de autorización con al menos dos usuarios.
2. Completar edición de tareas con versionado.
3. Implementar notas.
4. Sustituir project_id manual por selector de proyectos autorizados.
5. Conectar métricas reales al dashboard.

## CRUD de notas — 2026-10-21

Implementado el módulo de notas con listado, creación, edición, fijado/desfijado y borrado lógico. Las notas privadas y compartidas aplican autorización por propietario, membresía y rol; las mutaciones usan CSRF, consultas parametrizadas y control optimista de versión.

Archivos nuevos: `app/Models/Note.php`, `app/Controllers/NoteController.php`, `app/Views/notes/index.php` y `public/assets/css/notes.css`. Se actualizaron las rutas en `public/index.php`.

Validación: todos los archivos PHP pasan lint con PHP 7.4.33. Pendiente: selector visual de proyectos, pruebas automatizadas y conexión de métricas reales al dashboard.

## Selector visual de proyectos — 2026-10-21

Se reemplazó el campo manual de project_id en tareas y notas por un selector que carga únicamente los proyectos accesibles al usuario, mostrando nombre y rol. El backend continúa verificando autorización antes de crear la asociación.

Se actualizaron TaskController, NoteController, public/index.php, las vistas de tareas/notas y el estilo de notas. Lint PHP 7.4.33 correcto.

## Corrección responsive — 2026-10-21

Se corrigió el desbordamiento horizontal de los controles del módulo de tareas en pantallas pequeñas. Se añadieron restricciones de ancho y mínimos flexibles para inputs, textareas, selects, botones, tarjetas, formularios y contenedores de grid en `public/assets/css/app.css`.

También se revisaron las reglas responsive existentes de tareas, proyectos, login y dashboard. En móvil, tareas y proyectos pasan a una sola columna; los controles se mantienen dentro de sus tarjetas; el dashboard conserva la navegación compacta y sus rejillas se adaptan.

No se modificó la lógica PHP ni el manejo de datos. Pendiente: validar visualmente en dispositivos reales de 320px, 375px y 390px cuando el servidor local esté disponible.

### 2026-10-14 — Fase 3 / proyectos
**Objetivo:** habilitar el primer incremento funcional de proyectos con autorización por propietario o membresía.
**Archivos creados:** `app/Models/Project.php`, `app/Controllers/ProjectController.php`, `app/Views/projects/index.php`.
**Archivos modificados:** `public/index.php`.
**Implementado:** listado de proyectos accesibles, creación, edición para propietario/admin y archivado lógico solo por propietario; todas las mutaciones requieren CSRF y las consultas usan parámetros.
**Pruebas:** lint PHP 7.4.33 correcto para `app/`, `config/` y `public/`.
**Pendiente:** gestión de miembros, invitaciones y pruebas de autorización entre usuarios.
**Próximo paso concreto:** implementar administración de miembros e invitaciones con tokens de un solo uso.

### 2026-10-14 — Fase 3 / miembros
**Objetivo:** permitir administrar colaboradores existentes dentro de un proyecto.
**Archivos modificados:** `app/Models/Project.php`, `app/Controllers/ProjectController.php`, `app/Views/projects/index.php`, `public/index.php`, `public/assets/css/projects.css`.
**Implementado:** listado de miembros, alta por correo de usuarios activos, roles lector/editor/administrador, retiro de miembros, CSRF y restricciones para que los administradores no gestionen a otros administradores.
**Pruebas:** lint PHP 7.4.33 correcto.
**Pendiente:** invitaciones con token seguro y pruebas funcionales con dos cuentas.
**Próximo paso concreto:** implementar invitaciones de un solo uso y aceptación transaccional.

### 2026-10-14 — Fase 4 / tareas
**Objetivo:** habilitar el primer CRUD funcional de tareas sin invitaciones ni tokens.
**Archivos creados:** `app/Models/Task.php`, `app/Controllers/TaskController.php`, `app/Views/tasks/index.php`, `public/assets/css/tasks.css`.
**Archivos modificados:** `public/index.php`.
**Implementado:** creación, listado de tareas privadas o de proyectos, prioridades, fecha/hora, completar/reabrir, borrado lógico y autorización por propietario/rol editor/admin.
**Seguridad:** CSRF en mutaciones, consultas parametrizadas y control optimista por `version` con HTTP 409 ante conflicto.
**Pruebas:** lint PHP 7.4.33 correcto en `app/`, `config/` y `public/`.
**Pendiente:** edición de tareas, notas y pruebas funcionales con múltiples usuarios.
**Próximo paso concreto:** completar edición de tareas y comenzar CRUD de notas.
Validar el bootstrap con PHP 7.4.33 por CLI y HTTP; después continuar con la seguridad de Fase 1 sin cambiar el WampServer compartido.

### 2026-10-12 — Fase 1: autenticación base
**Objetivo:**
Iniciar autenticación sin implementar módulos de tareas, notas o colaboración.

**Archivos creados/modificados:**
- Creados: `app/Core/Session.php`, `app/Core/Csrf.php`, `app/Core/Auth.php`, `app/Models/User.php`, `app/Controllers/AuthController.php` y `app/Views/auth/login.php`.
- Modificados: `app/Core/Router.php`, `public/index.php` y `PROGRESS.md`.

**Pruebas ejecutadas y resultado:**
- Sintaxis correcta con PHP 7.4.33 en todos los archivos PHP de `app/`, `config/` y `public/`.
- Visitante en `/` recibe redirección a `/login`; el formulario genera token CSRF y cookie HttpOnly/SameSite=Lax.
- POST sin token CSRF devuelve HTTP 403. Seis intentos inválidos en la misma sesión devuelven HTTP 429 en el sexto intento.
- `scripts/create_initial_user.php --dry-run` validó correctamente una entrada de prueba y confirmó que no creó ningún usuario; la sintaxis del envoltorio PowerShell también fue correcta.
- La cuenta inicial fue creada mediante la herramienta local. Login devolvió HTTP 302, la zona autenticada HTTP 200 y logout invalidó la cookie; una petición posterior volvió a redirigir al login.

**Decisiones:**
- Las contraseñas se verifican con `password_verify()` y la sesión se regenera después de un acceso válido.
- El límite inicial es de cinco intentos fallidos por sesión durante quince minutos. No se introdujo polling ni servicio externo.
- La primera cuenta se crea únicamente con herramienta local administrada; se mantiene deshabilitado el registro público.
- Por decisión del usuario, la herramienta de alta inicial acepta cualquier contraseña no vacía; la aplicación sigue usando `password_hash()` y `password_verify()`.

**Problemas pendientes:**
- La gestión de invitaciones se implementará en la Fase 3; no existe registro público.

**Próximo paso concreto:**
Continuar con Fase 2: dashboard responsive, tema persistente y métricas sin polling.

## Decisiones pendientes
- Herramienta de servidor local: XAMPP, Laragon, PHP/Apache/MySQL instalados manualmente u otra.
- Directorio definitivo del proyecto y dominio local.
- Configuración de correo para invitaciones; alternativa inicial: enlace copiable.
- Política de registro: cuenta inicial administrada; sin registro público abierto en V1.

## Bloqueos conocidos
- El prototipo visual es demostrativo y no está conectado a MySQL.

## Plantilla de actualización para Codex
### [Fecha] — [Fase]
**Objetivo:**
**Archivos creados/modificados:**
**Pruebas ejecutadas y resultado:**
**Decisiones:**
**Problemas pendientes:**
**Próximo paso concreto:**

## Edición completa de tareas — 2026-10-21

Se añadió edición de título, descripción, prioridad, fechas y proyecto asociado. La actualización valida permisos de escritura, proyecto destino autorizado, CSRF y versión optimista; devuelve HTTP 409 ante conflicto.

Se modificaron `app/Models/Task.php`, `app/Controllers/TaskController.php`, `app/Views/tasks/index.php` y `public/index.php`. Todos los archivos PHP pasan lint con PHP 7.4.33.

## Pruebas de calidad — 2026-10-22

Se añadió `tests/smoke.php`, una prueba no destructiva que verifica la conexión PDO, la existencia de las seis tablas y una consulta de lectura por tabla. El script pasa lint PHP 7.4.33, pero su ejecución quedó bloqueada en esta sesión por `SQLSTATE[HY000] [2002]`: PHP CLI no pudo abrir el socket local de MySQL. Debe ejecutarse nuevamente con WampServer/MySQL activo y permisos locales disponibles.

## Dashboard con datos reales — 2026-10-22

Se reemplazaron las métricas y contenidos demostrativos del dashboard por consultas reales a tareas pendientes, proyectos accesibles y notas recientes. El filtrado respeta propietario, autor y membresía; no se añadió polling.

Se añadió `app/Models/DashboardData.php` y se actualizaron `DashboardController`, `public/index.php`, la vista del dashboard y `app/assets/css/app.css` (ruta real: `public/assets/css/app.css`). Lint PHP 7.4.33 correcto.
## Unificación visual de módulos — 2026-10-22

Se añadieron reglas compartidas en `public/assets/css/app.css` para mantener el mismo tema visual en dashboard, tareas, proyectos y notas: colores basados en variables, tarjetas, controles, botones, bordes, tipografía y estados de foco. No se modificó lógica PHP ni persistencia.

## Proyectos archivados — 2026-10-22

Se añadió la sección de proyectos archivados para propietarios. Muestra nombre, descripción, fecha de archivado y estado, e incluye restauración mediante POST protegido con CSRF. No se implementó eliminación permanente.

Archivos modificados: `app/Models/Project.php`, `app/Controllers/ProjectController.php`, `app/Views/projects/index.php`, `public/index.php` y `public/assets/css/projects.css`. Lint PHP 7.4.33 correcto.
## Ajuste visual del formulario de tareas — 2026-10-22

Se reorganizó el formulario de edición de tareas para mostrar etiquetas y campos verticalmente, con separación consistente. Fecha y hora se mantienen en dos columnas en pantallas amplias y pasan a una sola columna en móviles.
## Navegación desde resumen — 2026-10-23

Las tarjetas Pendientes e Importantes del dashboard ahora dirigen a Tareas; Proyectos dirige a Proyectos; y Notas recientes dirige a Notas. Se añadió navegación por clic y por teclado mediante un script local, con estilos de foco y hover.

## Tabla y modal de tareas — 2026-10-23

La vista de Tareas ahora utiliza una tabla responsive en lugar de tarjetas. Cada fila permite desplegar el detalle, las acciones de completar/eliminar y el formulario de edición mediante clic, Enter o Espacio. La creación se trasladó a un modal accesible, abierto desde el botón + Nueva tarea y cerrable con el botón, el fondo o Escape.

Se añadieron app/Views/tasks/index-table.php, public/assets/css/tasks-table.css y public/assets/js/tasks.js; TaskController ahora carga esta nueva vista. Se preservaron CSRF, permisos, validación de proyecto y control optimista de versión. Lint con PHP 7.4.33 correcto para la vista y el controlador. Pendiente: verificación visual manual con datos reales en navegador y pantalla móvil.

## Búsqueda y columnas de tareas — 2026-10-23

Se añadió un buscador local en la tabla de tareas. Filtra por el contenido visible de cada tarea y actualiza el contador sin realizar consultas ni recargar la página. La columna Estado se movió para quedar inmediatamente después de Prioridad. El buscador mantiene una disposición adaptable para móvil.

El control Buscar se sustituyó por un botón de lupa con etiqueta accesible. Se ajustó su rejilla para separar correctamente el campo de búsqueda y el botón en escritorio y móvil.

La búsqueda de tareas también quedó disponible mediante GET en el servidor. Esto permite que la lupa siga funcionando si JavaScript no carga o se encuentra desactualizado en el navegador; cuando no hay coincidencias se muestra un mensaje específico.

Por decisión de interfaz, se retiró el botón de lupa porque el filtro se aplica instantáneamente al escribir. La tecla Enter conserva la búsqueda de respaldo del servidor.

## Configuración y próximas tareas — 2026-10-23

Se añadió el módulo Configuración, con actualización de contraseña mediante confirmación de la contraseña actual y una preferencia individual de días para el bloque Próximas tareas. El dashboard ahora incluye únicamente tareas pendientes fechadas desde hoy hasta el periodo seleccionado, sin límite de registros; las tareas sin fecha o vencidas quedan fuera de ese bloque.

Se agregaron SettingsController, la vista y estilos de Configuración, rutas y la migración database/migrations/20261023_add_user_settings.sql. La migración requiere una cuenta MySQL administradora porque mi_panel_app no tiene permiso ALTER; mientras no se aplique, la aplicación mantiene 7 días como valor predeterminado y desactiva el guardado del periodo para evitar errores.

Se corrigió el espacio de nombres de SettingsController para que el autocargador de PHP pueda localizarlo desde public/index.php.

Se corrigió una redirección circular del DashboardController: las rutas /login y /settings ahora se consideran destinos válidos al redirigir. Esto evita que una sesión no autenticada vuelva a / de forma indefinida.

La política de cambio de contraseña quedó sin longitud mínima por solicitud del usuario; se conserva la obligación de que no esté vacía, coincida con la confirmación y sea diferente de la contraseña actual.

Se añadió el cierre de sesión mediante POST protegido con CSRF en la barra lateral de Inicio, Tareas, Proyectos, Notas y Configuración.

Se añadió el botón Sincronizar ahora en la barra lateral. Recarga el módulo actual y vuelve a consultar los datos locales, sin polling, servicios externos ni cierre de sesión.

Se corrigió la referencia al servicio CSRF del botón de cierre de sesión en el dashboard, que impedía renderizar Inicio.
