194 lines
5.5 KiB
Markdown
194 lines
5.5 KiB
Markdown
# 🛒 CarritoIA
|
|
|
|
Aplicación web personal para automatizar y predecir la lista de la compra a partir de tickets de Mercadona. Procesa PDFs reales, aplica análisis de frecuencias y genera sugerencias de compra organizadas por periodicidad.
|
|
|
|

|
|

|
|

|
|

|
|
|
|
---
|
|
|
|
## ¿Qué hace?
|
|
|
|
A partir de los tickets de compra en PDF de Mercadona, la aplicación:
|
|
|
|
1. **Extrae** los productos, cantidades y precios de cada ticket (PDF o foto)
|
|
2. **Analiza** la frecuencia de compra histórica de cada producto
|
|
3. **Predice** cuándo toca volver a comprar cada artículo
|
|
4. **Organiza** los productos en grupos: semanal, quincenal, mensual, esporádico
|
|
5. **Genera** una lista de la compra lista para copiar y pegar
|
|
|
|
---
|
|
|
|
## Capturas
|
|
|
|
| Lista de la compra | Estadísticas |
|
|
|---|---|
|
|
| Productos agrupados por frecuencia, colapsables | Top productos, gasto mensual, evolución |
|
|
|
|
---
|
|
|
|
## Funcionalidades
|
|
|
|
### 📋 Lista de la compra
|
|
- Grupos colapsables: **semanal / quincenal / mensual / esporádico**
|
|
- Contador de ítems por grupo visible aunque esté plegado
|
|
- Marca productos con un clic y copia la lista al portapapeles
|
|
- Añadir productos manualmente
|
|
- Indicador de productos de temporada 🌱
|
|
|
|
### 📄 Procesado de tickets
|
|
- **Subir PDF** directamente desde el navegador (drag & drop)
|
|
- **Subir foto** del ticket con OCR automático (EasyOCR, español + inglés)
|
|
- **Importar desde correo** — descarga automática de PDFs adjuntos via IMAP
|
|
- Pipeline completo: extracción → análisis → predicción en un solo paso
|
|
|
|
### 📊 Estadísticas
|
|
- Top productos más comprados
|
|
- Gasto mensual histórico
|
|
- Evolución del precio de cada producto
|
|
|
|
### 👥 Multi-usuario
|
|
- Registro e inicio de sesión con contraseñas hasheadas (bcrypt via Werkzeug)
|
|
- Datos completamente separados por usuario (`tickets/{usuario}/`, `datos/{usuario}/`)
|
|
- Panel de administración para gestionar usuarios
|
|
- Configuración IMAP personalizada por usuario desde el perfil
|
|
|
|
---
|
|
|
|
## Stack técnico
|
|
|
|
| Componente | Tecnología |
|
|
|---|---|
|
|
| Backend | Python 3.12 + Flask 3.0 |
|
|
| Producción | Gunicorn + Nginx (reverse proxy) |
|
|
| OCR | EasyOCR (es + en) |
|
|
| Análisis | Pandas + NumPy |
|
|
| PDFs | PyPDF2 |
|
|
| Auth | Werkzeug (bcrypt) |
|
|
| Contenedor | Docker + Docker Compose |
|
|
|
|
---
|
|
|
|
## Estructura del proyecto
|
|
|
|
```
|
|
autocompra/
|
|
├── app.py # Aplicación Flask principal
|
|
├── autocompra7.py # Parser de PDFs → CSVs
|
|
├── generar_lista.py # Generador de predicciones (datos.json)
|
|
├── importar_tickets_email.py # Importador IMAP de tickets
|
|
├── requirements.txt
|
|
├── Dockerfile
|
|
├── docker-compose.yml
|
|
├── config.ini # Configuración (no incluido en repo)
|
|
├── users.json # Usuarios y config por usuario (no incluido)
|
|
├── tickets/
|
|
│ └── {usuario}/ # PDFs de tickets por usuario
|
|
├── datos/
|
|
│ └── {usuario}/ # CSVs y datos generados por usuario
|
|
├── templates/
|
|
│ ├── index.html # Lista de la compra
|
|
│ ├── estadisticas.html # Dashboard estadísticas
|
|
│ ├── perfil.html # Perfil y config IMAP
|
|
│ └── admin.html # Panel de administración
|
|
└── static/
|
|
└── css/style.css
|
|
```
|
|
|
|
---
|
|
|
|
## Instalación y puesta en marcha
|
|
|
|
### Con Docker (recomendado)
|
|
|
|
```bash
|
|
git clone https://github.com/tu-usuario/autocompra.git
|
|
cd autocompra
|
|
|
|
# Crear config.ini con los datos de tu buzón IMAP
|
|
cp config.ini.example config.ini
|
|
nano config.ini
|
|
|
|
# Lanzar
|
|
docker compose up -d --build
|
|
```
|
|
|
|
La app queda disponible en `http://localhost:8088`.
|
|
|
|
### Sin Docker (desarrollo)
|
|
|
|
```bash
|
|
python -m venv venv
|
|
source venv/bin/activate # Linux/Mac
|
|
venv\Scripts\activate # Windows
|
|
|
|
pip install -r requirements.txt
|
|
python app.py
|
|
```
|
|
|
|
---
|
|
|
|
## Configuración (`config.ini`)
|
|
|
|
```ini
|
|
[email]
|
|
imap_host = imap.tu-proveedor.es
|
|
imap_port = 993
|
|
correo = tu@email.com
|
|
password = tu_password
|
|
remitente = noreply@mercadona.es
|
|
ssl_verify = true
|
|
ejecutar_pipeline = true
|
|
```
|
|
|
|
> La contraseña se puede sobreescribir con la variable de entorno `EMAIL_PASSWORD`.
|
|
|
|
---
|
|
|
|
## Variables de entorno
|
|
|
|
| Variable | Descripción |
|
|
|---|---|
|
|
| `SECRET_KEY` | Clave secreta de Flask para sesiones |
|
|
| `ADMIN_PASSWORD` | Contraseña del usuario `admin` (primer arranque) |
|
|
| `EMAIL_CORREO` | Usuario IMAP (sobreescribe config.ini) |
|
|
| `EMAIL_PASSWORD` | Contraseña IMAP (sobreescribe config.ini) |
|
|
|
|
---
|
|
|
|
## Pipeline manual
|
|
|
|
Si quieres reprocesar todos los tickets de un usuario:
|
|
|
|
```bash
|
|
# Dentro del contenedor
|
|
docker exec autocompra python autocompra7.py --usuario tatiana
|
|
docker exec autocompra python generar_lista.py --usuario tatiana
|
|
```
|
|
|
|
---
|
|
|
|
## Importación automática desde el correo
|
|
|
|
El script `importar_tickets_email.py` se puede ejecutar como cron para importar tickets nuevos automáticamente:
|
|
|
|
```cron
|
|
0 * * * * docker exec autocompra python importar_tickets_email.py --usuario tatiana >> ~/logs/autocompra.log 2>&1
|
|
```
|
|
|
|
---
|
|
|
|
## Notas de seguridad
|
|
|
|
- Las contraseñas se almacenan como hashes bcrypt, nunca en texto plano
|
|
- `config.ini` y `users.json` están excluidos del repositorio (`.gitignore`)
|
|
- Cambia `SECRET_KEY` en producción
|
|
|
|
---
|
|
|
|
## Licencia
|
|
|
|
MIT — siéntete libre de adaptarlo a tu supermercado favorito.
|