# Choque.cl Mockup

Aplicación web en PHP (Slim 4) para evaluación de daños vehiculares por imágenes, con flujo de pago y emisión de informe en PDF.

## Stack

- PHP + Slim (`slim/slim`, `slim/psr7`)
- MySQL (PDO)
- Frontend server-rendered con vistas PHP + Tailwind (CDN)
- Integraciones:
  - API de análisis de imágenes local: `http://127.0.0.1:5000/analyze`
  - Mercado Pago Checkout Pro (preferencias + redirección)
  - Generación de PDF: `dompdf/dompdf`
  - Envío de correo SMTP: `phpmailer/phpmailer`

## Requisitos

- PHP 8.2+ recomendado
- Extensiones PHP: `pdo_mysql`, `curl`, `fileinfo`, `mbstring`
- MySQL/MariaDB con esquema compatible
- Composer
- Servidor web (Apache/Nginx) apuntando a `public/`

## Instalación

1. Instalar dependencias:

```bash
composer install
```

2. Configurar variables de entorno en `.env`.

3. Asegurar permisos de escritura:
   - `storage/uploads`
   - `storage/logs`
   - `storage/ratelimit`

4. Configurar virtual host para servir `public/` como DocumentRoot.

## Variables de entorno

Archivo: `.env`

Variables usadas por el sistema:

- `APP_ENV`
- `APP_BASE_PATH` (ej: `/public` si aplica)
- `DB_HOST`
- `DB_PORT`
- `DB_NAME`
- `DB_USER`
- `DB_PASS`
- `DB_CHARSET`
- `ANALYZE_DEBUG` (`1` para log de análisis)
- `RECAPTCHA_SITE_KEY`
- `RECAPTCHA_SECRET`
- `RECAPTCHA_MIN_SCORE`
- `MP_PUBLIC_KEY`
- `MP_ACCESS_TOKEN`
- `MAIL_HOST`
- `MAIL_PORT`
- `MAIL_USER`
- `MAIL_PASS`

## Estructura principal

- `public/index.php`: bootstrap y rutas HTTP
- `src/helpers.php`: utilidades (env, DB, validaciones, rate limit, análisis)
- `views/`: layout + páginas del flujo
- `views/pdf/informe.php`: template HTML del PDF
- `public/assets/app.js`: lógica frontend (subida, reintentos, pago)
- `storage/`: uploads, logs y estado rate limit

## Flujo funcional

1. `welcome`
2. `panorama` (filtro de seguridad)
3. `datos` (validaciones de solicitante)
4. `imagenes` (subida de 3 a 6 imágenes)
5. `loading` (proceso y reintentos)
6. `result-pos` o `result-neg`
7. `result-pos` -> pago Mercado Pago
8. `informe` -> descarga y envío PDF

## Rutas principales

- `GET /` renderiza pasos por `?step=...`
- `POST /panorama`
- `POST /datos`
- `POST /imagenes`
- `POST /procesar`
- `POST /mp/preference`
- `GET /mp/return`
- `POST /pago` (flujo demo alternativo)
- `GET /informe/pdf`

## Pago (Mercado Pago Checkout Pro)

Endpoint backend:

- `POST /mp/preference` crea preferencia usando:
  - `items.title = "Informe Choque.cl"`
  - `items.quantity = 1`
  - `items.unit_price = 4900`
  - `items.currency_id = "CLP"`
  - `back_urls.success|failure|pending`
  - `auto_return = "approved"`
  - `external_reference = solicitud_id`

Frontend:

- Botón en `result-pos` llama `/mp/preference`
- Redirección a `init_point` retornado por Mercado Pago
- Retorno en `GET /mp/return` registra pago e informa estado

## PDF + correo

Ruta:

- `GET /informe/pdf`

Comportamiento:

- Valida sesión y pago
- Genera PDF desde `views/pdf/informe.php`
- Inserta logo desde `public/assets/images/choque.png`
- Envía correo con asunto `Evaluacion Choque.cl`
- Adjunta `Informe_Choque.pdf`
- Devuelve descarga del PDF al usuario en la misma operación

SMTP:

- Se toma desde `MAIL_HOST`, `MAIL_PORT`, `MAIL_USER`, `MAIL_PASS`
- Implementado con `PHPMailer` en modo SMTP autenticado

## Persistencia esperada (tablas)

El código usa estas tablas:

- `solicitud`
- `imagen`
- `respuesta_solicitud`
- `solicitud_aprobada`
- `pago`

No hay migraciones en este repositorio. El esquema debe existir en la base de datos.

## Seguridad y validaciones

- Validaciones:
  - RUT
  - patente
  - email
  - cantidad/tipo de imágenes
- Rate limit por IP en archivos JSON (`storage/ratelimit`)
- Estado de flujo por sesión + estado en DB
- Token de formulario para subida de imágenes

## Logs

- `storage/logs/attempts.log`: eventos del flujo
- `storage/logs/analyze.log`: debug de análisis (si `ANALYZE_DEBUG=1`)

## Problemas comunes

- Error `No se pudo crear la preferencia`:
  - revisar `MP_ACCESS_TOKEN`
  - revisar conectividad saliente HTTPS
  - revisar `APP_BASE_PATH` y `back_urls`
- Error de subida:
  - verificar permisos en `storage/uploads`
  - revisar límites PHP (`upload_max_filesize`, `post_max_size`)
- PDF/correo no sale:
  - verificar dependencia `dompdf`/`phpmailer`
  - revisar credenciales SMTP
  - revisar bloqueo de puerto SMTP

## Notas operativas

- El sistema usa un precio fijo de cobro (`$paymentPrice = 4900.0`).
- El costo estimado retornado por la API de análisis se guarda para el informe, pero no define el cobro.

