diff --git a/README.md b/README.md new file mode 100644 index 0000000..248af29 --- /dev/null +++ b/README.md @@ -0,0 +1,193 @@ +# 🛒 Lista de la Compra Inteligente + +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. + +![Python](https://img.shields.io/badge/Python-3.12-blue?logo=python&logoColor=white) +![Flask](https://img.shields.io/badge/Flask-3.0-black?logo=flask) +![Docker](https://img.shields.io/badge/Docker-Compose-2496ED?logo=docker&logoColor=white) +![License](https://img.shields.io/badge/license-MIT-green) + +--- + +## ¿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.