carritoIA/README.md

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.
![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.