# Contexto rápido

Última revisión: **2026-09-28**. Referencia Git: `main`, `83c7589`.

## Qué es

Aplicación web llamada **Contingencia**, orientada a registrar y gestionar pedidos de helados. El contexto comercial se infiere del formulario y la identidad visual; no hay una especificación funcional propia en el README original.

## Stack y organización

- Monolito MVC: PHP `^8.2`, CodeIgniter 4.7.2 y Shield 1.3.0 según `composer.lock`.
- MySQL mediante `MySQLi`; pruebas de ejemplo con SQLite en memoria.
- Vistas PHP con jQuery, Bootstrap, DataTables, Typeahead, SweetAlert2 y Notyf.
- JavaScript de negocio dentro de `app/Views/form.php` y `app/Views/dashboard.php`.
- Composer gestiona PHP. No hay manifiesto npm ni proceso de compilación frontend propio localizado.
- Entorno Docker local: FrankenPHP/PHP 8.3, Caddy y red externa DAMP.

## Acceso SSH al servidor

- Servidor indicado por el usuario: `162.240.154.102`.
- Puerto SSH confirmado: **`22022`**.
- Usuario y método de autenticación: pendientes de confirmar.
- Conexión todavía no realizada ni verificada.

Comando de referencia (sustituir `usuario` por el usuario SSH real):

```sh
ssh -p 22022 usuario@162.240.154.102
```

## Archivos para empezar

| Necesidad | Archivo |
| --- | --- |
| Rutas y protección de páginas | `app/Config/Routes.php`, `app/Config/Filters.php` |
| Captura de pedidos | `app/Controllers/Home.php`, `app/Views/form.php` |
| API de pedidos y detalles | `app/Controllers/Order.php` |
| Consulta con JOIN | `app/Models/OrderModel.php::getOrdersWithDetails()` |
| Persistencia de renglones | `app/Models/OrderDetailModel.php` |
| Gestión, selección y exportación | `app/Views/dashboard.php` |
| Esquema | `app/Database/Migrations/` |
| Inicio de sesión | `app/Config/Auth.php`, `app/Views/login.php` |
| Arranque local | `Dockerfile`, `docker-compose.yml`, `Caddyfile`, `Dampfile` |

## Reglas y particularidades actuales

- `/` es público. El navegador solicita cliente de ocho dígitos que comience con `10` o `30`, y cantidades de 1 a 99. Valida el cliente antes de agregar productos y guardar; si no cumple, muestra un popup SweetAlert2 y devuelve el foco al campo para corregirlo.
- `POST /order` recibe datos de formulario, no JSON; incluye `client` e `items[]`.
- `GET /order` devuelve una fila por detalle, repitiendo la cabecera del pedido.
- `id` identifica la cabecera; `detail_id` identifica el renglón.
- `POST /complete/{id}` y `DELETE /order/{id}` operan sobre **detalles**, no cabeceras.
- `PATCH /complete-batch` recibe JSON con `ids` de detalles.
- Completar detalles no actualiza `orders.status`.
- El borrado es lógico; al borrar el último detalle activo también se borra lógicamente la cabecera, dentro de una transacción.
- Solamente `/dashboard` y `/stats` tienen filtro `session` en las rutas de negocio.
- Shield deshabilita registro público y acceso por enlace mágico. Sus rutas se registran de todos modos.
- Estadísticas es un marcador de posición; el menú muestra un aviso en lugar de navegar.

## Atención en futuros cambios

Priorizar autorización de la API, validación del servidor y creación atómica. `OrderModel` permite campos internos como `id` y el controlador llena la entidad con todo el POST. Revisar [HALLAZGOS.md](HALLAZGOS.md) antes de modificar esos flujos.

No tratar los scripts de demostración en `public/assets/js/` como módulos de negocio implementados. No hay seed de productos ni procedimiento de importación versionado.

## Comprobaciones disponibles

```sh
composer validate --no-check-publish
composer check-platform-reqs
php spark routes
php vendor/bin/phpunit --no-coverage --no-logging --do-not-cache-result
```

Resultado de la revisión: comandos correctos; PHPUnit **5 pruebas / 7 aserciones**; lint de **88 archivos PHP** correcto. Ejecución en PHP CLI **8.5.0**, no en el contenedor PHP 8.3. No hay pruebas de negocio de pedidos.

## Estado local encontrado

Antes del análisis existían cambios en `Caddyfile`, `Dockerfile` y `docker-compose.yml`, y un `Dampfile` sin seguimiento. La documentación describe esos archivos tal como estaban en el directorio de trabajo. El análisis inicial agregó documentos dentro de `Docs/`; posteriormente se implementó la validación de prefijos de cliente en `app/Views/form.php`.
