From 6930c63ca52605316004e9384f4f07f7ebf7e747 Mon Sep 17 00:00:00 2001 From: Tatiana Villa Ema Date: Fri, 24 Apr 2026 23:32:18 +0200 Subject: [PATCH] Automatizacion de tareas --- app.py | 202 +++++++ css/style.css | 269 +++++++++ datos.js | 724 ++++++++++++++++++++++++ escanear_productos.html | 90 +++ generar_lista.py | 110 ++++ importar_tickets_email.py | 196 +++++++ index.html | 302 ++++++---- servidor/guardar_producto.php | 40 ++ tickets/20250424 Mercadona 166,83 €.pdf | Bin 0 -> 34828 bytes tickets/20250430 Mercadona 148,40 €.pdf | Bin 0 -> 34591 bytes 10 files changed, 1838 insertions(+), 95 deletions(-) create mode 100644 app.py create mode 100644 css/style.css create mode 100644 datos.js create mode 100644 escanear_productos.html create mode 100644 generar_lista.py create mode 100644 importar_tickets_email.py create mode 100644 servidor/guardar_producto.php create mode 100644 tickets/20250424 Mercadona 166,83 €.pdf create mode 100644 tickets/20250430 Mercadona 148,40 €.pdf diff --git a/app.py b/app.py new file mode 100644 index 0000000..99da57d --- /dev/null +++ b/app.py @@ -0,0 +1,202 @@ +""" +app.py — Lista de la Compra Inteligente +Flask app con autenticacion de sesion. + +Arrancar en desarrollo: + python app.py + +En produccion usa gunicorn detras de nginx: + gunicorn -w 2 -b 127.0.0.1:5000 app:app +""" + +import os +import json +import subprocess +import sys +from pathlib import Path +from functools import wraps +from datetime import timedelta + +from flask import ( + Flask, render_template, request, redirect, + url_for, session, jsonify, abort, send_from_directory +) +from werkzeug.security import generate_password_hash, check_password_hash + +# ----------------------------------------------------------------------- +# Configuracion +# ----------------------------------------------------------------------- +BASE_DIR = Path(__file__).parent +DATOS_JSON = BASE_DIR / "datos.json" +USERS_FILE = BASE_DIR / "users.json" +TICKETS_DIR = BASE_DIR / "tickets" + +app = Flask(__name__, template_folder="templates", static_folder="static") + +app.secret_key = os.environ.get("SECRET_KEY", "cambia-esto-en-produccion-!!!!") +app.permanent_session_lifetime = timedelta(days=30) + +# ----------------------------------------------------------------------- +# Gestion de usuarios (users.json — NO subir al repo) +# ----------------------------------------------------------------------- +def cargar_usuarios(): + if not USERS_FILE.exists(): + return {} + with open(USERS_FILE, encoding="utf-8") as f: + return json.load(f) + +def guardar_usuarios(users): + with open(USERS_FILE, "w", encoding="utf-8") as f: + json.dump(users, f, indent=2, ensure_ascii=False) + +def inicializar_admin(): + """Crea el usuario admin la primera vez si no existe users.json.""" + if USERS_FILE.exists(): + return + pwd = os.environ.get("ADMIN_PASSWORD", "cambia-esta-password") + users = { + "admin": { + "password_hash": generate_password_hash(pwd), + "nombre": "Admin" + } + } + guardar_usuarios(users) + print(f"[init] Usuario admin creado. Password: {pwd}") + print(f"[init] Cambialo en users.json o con ADMIN_PASSWORD en el entorno.") + +# ----------------------------------------------------------------------- +# Decorador de autenticacion +# ----------------------------------------------------------------------- +def login_required(f): + @wraps(f) + def decorated(*args, **kwargs): + if not session.get("usuario"): + return redirect(url_for("login", next=request.path)) + return f(*args, **kwargs) + return decorated + +# ----------------------------------------------------------------------- +# Rutas de autenticacion +# ----------------------------------------------------------------------- +@app.route("/login", methods=["GET", "POST"]) +def login(): + error = None + if request.method == "POST": + usuario = request.form.get("usuario", "").strip().lower() + password = request.form.get("password", "") + users = cargar_usuarios() + user = users.get(usuario) + if user and check_password_hash(user["password_hash"], password): + session.permanent = True + session["usuario"] = usuario + session["nombre"] = user.get("nombre", usuario) + next_url = request.form.get("next") or url_for("index") + return redirect(next_url) + error = "Usuario o contrasena incorrectos" + return render_template("login.html", error=error, + next=request.args.get("next", "")) + +@app.route("/logout") +def logout(): + session.clear() + return redirect(url_for("login")) + +# ----------------------------------------------------------------------- +# Pagina principal +# ----------------------------------------------------------------------- +@app.route("/") +@login_required +def index(): + return render_template("index.html", nombre=session.get("nombre", "")) + +# ----------------------------------------------------------------------- +# API: datos de predicciones +# ----------------------------------------------------------------------- +@app.route("/api/datos") +@login_required +def api_datos(): + if not DATOS_JSON.exists(): + return jsonify({"error": "datos.json no generado", "predicciones": []}), 404 + with open(DATOS_JSON, encoding="utf-8") as f: + datos = json.load(f) + return jsonify(datos) + +# ----------------------------------------------------------------------- +# API: forzar regeneracion del pipeline +# ----------------------------------------------------------------------- +@app.route("/api/regenerar", methods=["POST"]) +@login_required +def api_regenerar(): + try: + subprocess.run( + [sys.executable, str(BASE_DIR / "autocompra7.py")], + cwd=str(BASE_DIR), check=True, capture_output=True, timeout=120 + ) + subprocess.run( + [sys.executable, str(BASE_DIR / "generar_lista.py")], + cwd=str(BASE_DIR), check=True, capture_output=True, timeout=30 + ) + return jsonify({"ok": True, "mensaje": "Pipeline ejecutado correctamente"}) + except subprocess.CalledProcessError as e: + return jsonify({"ok": False, "mensaje": str(e)}), 500 + except subprocess.TimeoutExpired: + return jsonify({"ok": False, "mensaje": "Timeout al ejecutar el pipeline"}), 500 + +# ----------------------------------------------------------------------- +# Archivos estaticos de tickets (solo autenticados) +# ----------------------------------------------------------------------- +@app.route("/tickets/") +@login_required +def ticket_file(filename): + return send_from_directory(str(TICKETS_DIR), filename) + +# ----------------------------------------------------------------------- +# Gestion de usuarios (solo admin) +# ----------------------------------------------------------------------- +@app.route("/admin/usuarios") +@login_required +def admin_usuarios(): + if session.get("usuario") != "admin": + abort(403) + users = cargar_usuarios() + lista = [{"usuario": k, "nombre": v.get("nombre", k)} for k, v in users.items()] + return render_template("admin_usuarios.html", usuarios=lista) + +@app.route("/admin/usuarios/crear", methods=["POST"]) +@login_required +def admin_crear_usuario(): + if session.get("usuario") != "admin": + abort(403) + usuario = request.form.get("usuario", "").strip().lower() + nombre = request.form.get("nombre", "").strip() + password = request.form.get("password", "") + if not usuario or not password: + abort(400) + users = cargar_usuarios() + users[usuario] = { + "password_hash": generate_password_hash(password), + "nombre": nombre or usuario + } + guardar_usuarios(users) + return redirect(url_for("admin_usuarios")) + +@app.route("/admin/usuarios/eliminar", methods=["POST"]) +@login_required +def admin_eliminar_usuario(): + if session.get("usuario") != "admin": + abort(403) + usuario = request.form.get("usuario", "").strip().lower() + if usuario == "admin": + abort(400) + users = cargar_usuarios() + users.pop(usuario, None) + guardar_usuarios(users) + return redirect(url_for("admin_usuarios")) + +# ----------------------------------------------------------------------- +# Entry point +# ----------------------------------------------------------------------- +if __name__ == "__main__": + inicializar_admin() + debug = os.environ.get("FLASK_DEBUG", "false").lower() == "true" + app.run(host="127.0.0.1", port=5000, debug=debug) \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..30ebdc4 --- /dev/null +++ b/css/style.css @@ -0,0 +1,269 @@ +/* ============================================================ + Lista de la Compra Inteligente — Dark Theme + ============================================================ */ + +:root { + --bg: #0d1117; + --bg-card: #161b22; + --bg-hover: #1c2128; + --bg-input: #0d1117; + --border: #30363d; + --text: #e6edf3; + --text-muted: #8b949e; + --primary: #388bfd; + --primary-h: #58a6ff; + + /* badges */ + --badge-sem-bg: #3d2b1f; + --badge-sem-tx: #f0883e; + --badge-qui-bg: #2d2816; + --badge-qui-tx: #d29922; + --badge-men-bg: #162518; + --badge-men-tx: #3fb950; + --badge-esp-bg: #21262d; + --badge-esp-tx: #8b949e; +} + +*, *::before, *::after { box-sizing: border-box; } + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + max-width: 960px; + margin: 0 auto; + padding: 1rem; + background: var(--bg); + color: var(--text); + min-height: 100vh; +} + +h1 { font-size: 1.6rem; margin: 0 0 .25rem; color: var(--text); } +h2 { + font-size: .85rem; + margin: 1.5rem 0 .5rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: .08em; + font-weight: 600; +} + +.subtitle { color: var(--text-muted); font-size: .85rem; margin-bottom: 1.5rem; } + +/* ---- Layout ---- */ +.layout { + display: grid; + grid-template-columns: 1fr 300px; + gap: 1.5rem; + align-items: start; +} +@media (max-width: 700px) { + .layout { grid-template-columns: 1fr; } +} + +/* ---- Cards ---- */ +.card { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 10px; + padding: 1rem 1.25rem; + margin-bottom: 1rem; +} +.card-header { + display: flex; + align-items: center; + gap: .5rem; + margin-bottom: .75rem; +} +.card-header strong { color: var(--text); font-size: .95rem; } + +/* ---- Badges ---- */ +.badge { + display: inline-block; + padding: .2rem .6rem; + border-radius: 20px; + font-size: .72rem; + font-weight: 600; +} +.badge-rojo { background: var(--badge-sem-bg); color: var(--badge-sem-tx); } +.badge-naranja { background: var(--badge-qui-bg); color: var(--badge-qui-tx); } +.badge-verde { background: var(--badge-men-bg); color: var(--badge-men-tx); } +.badge-gris { background: var(--badge-esp-bg); color: var(--badge-esp-tx); } + +/* ---- Producto item ---- */ +.prod-item { + display: flex; + align-items: center; + gap: .6rem; + padding: .45rem .25rem; + border-bottom: 1px solid var(--border); + cursor: pointer; + border-radius: 4px; + transition: background .1s; +} +.prod-item:last-child { border-bottom: none; } +.prod-item:hover { background: var(--bg-hover); } +.prod-item input[type="checkbox"] { + width: 15px; + height: 15px; + cursor: pointer; + flex-shrink: 0; + accent-color: var(--primary); +} +.prod-nombre { flex: 1; font-size: .92rem; color: var(--text); } +.prod-nombre.tachado { text-decoration: line-through; color: var(--text-muted); } +.prod-freq { font-size: .72rem; color: var(--text-muted); white-space: nowrap; } + +/* ---- Panel lateral ---- */ +.panel { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 10px; + padding: 1rem 1.25rem; + position: sticky; + top: 1rem; +} +.panel h2 { margin-top: 0; } + +#listaGenerada { + width: 100%; + height: 220px; + font-size: .88rem; + background: var(--bg-input); + color: var(--text); + border: 1px solid var(--border); + border-radius: 6px; + padding: .6rem; + resize: vertical; + font-family: inherit; +} +#listaGenerada:focus { outline: none; border-color: var(--primary); } + +/* ---- Botones ---- */ +.btn { + display: inline-flex; + align-items: center; + gap: .35rem; + padding: .5rem 1rem; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: .88rem; + font-weight: 500; + transition: background .15s; +} +.btn-primary { background: var(--primary); color: #fff; } +.btn-primary:hover { background: var(--primary-h); } +.btn-secondary { + background: #21262d; + color: var(--text); + border: 1px solid var(--border); + margin-left: .4rem; +} +.btn-secondary:hover { background: #30363d; } +.btn-sm { padding: .3rem .7rem; font-size: .8rem; } + +/* ---- Toolbar ---- */ +.toolbar { + display: flex; + gap: .5rem; + flex-wrap: wrap; + margin-bottom: 1rem; +} + +/* ---- Input añadir manual ---- */ +.add-row { display: flex; gap: .5rem; margin-top: .5rem; } +.add-row input { + flex: 1; + padding: .42rem .7rem; + background: var(--bg-input); + color: var(--text); + border: 1px solid var(--border); + border-radius: 6px; + font-size: .88rem; +} +.add-row input:focus { outline: none; border-color: var(--primary); } + +/* ---- Sin datos ---- */ +.no-datos { + text-align: center; + padding: 2rem; + color: var(--text-muted); + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 10px; +} +.no-datos code { + display: block; + background: var(--bg); + color: var(--primary-h); + border: 1px solid var(--border); + padding: .5rem 1rem; + border-radius: 6px; + margin: .75rem auto; + width: fit-content; + font-size: .9rem; +} + +/* ---- Drag & drop zona ticket ---- */ +.drop-zone { + border: 2px dashed var(--border); + border-radius: 8px; + padding: 1.2rem; + text-align: center; + color: var(--text-muted); + font-size: .85rem; + cursor: pointer; + transition: border-color .2s, background .2s; + margin-top: .5rem; + position: relative; +} +.drop-zone:hover, +.drop-zone.drag-over { + border-color: var(--primary); + background: #0d2044; + color: var(--text); +} +.drop-zone input[type="file"] { + position: absolute; + inset: 0; + opacity: 0; + cursor: pointer; + width: 100%; + height: 100%; +} +.drop-zone-icon { font-size: 1.5rem; display: block; margin-bottom: .3rem; } + +#pdfTexto { + white-space: pre-wrap; + background: var(--bg); + color: var(--text-muted); + border: 1px solid var(--border); + padding: .75rem; + border-radius: 6px; + font-size: .78rem; + max-height: 250px; + overflow-y: auto; + display: none; + margin-top: .75rem; + font-family: 'Courier New', monospace; +} + +/* ---- Count badge ---- */ +.count-badge { + background: var(--primary); + color: #fff; + border-radius: 50%; + width: 20px; + height: 20px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: .7rem; + font-weight: 700; + margin-left: .4rem; + vertical-align: middle; +} + +/* ---- Scrollbar oscura ---- */ +::-webkit-scrollbar { width: 6px; } +::-webkit-scrollbar-track { background: var(--bg); } +::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; } \ No newline at end of file diff --git a/datos.js b/datos.js new file mode 100644 index 0000000..7cb150b --- /dev/null +++ b/datos.js @@ -0,0 +1,724 @@ +// Generado el 24/04/2026 23:10 - 120 productos +const GENERADO = "24/04/2026 23:10"; +const predicciones = [ + { + "producto": "Champiñon Limpio Lam", + "fecha_estimada": "20/04/2025", + "dias_hasta": -369, + "frecuencia_dias": 4.9 + }, + { + "producto": "Q. Lonchas Light", + "fecha_estimada": "22/04/2025", + "dias_hasta": -367, + "frecuencia_dias": 6.0 + }, + { + "producto": "+Prot Pud Caramelo", + "fecha_estimada": "22/04/2025", + "dias_hasta": -367, + "frecuencia_dias": 6.9 + }, + { + "producto": "+Prot Natilla Vaini", + "fecha_estimada": "22/04/2025", + "dias_hasta": -367, + "frecuencia_dias": 6.9 + }, + { + "producto": "Girasoles Quesos", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "Q. Lonchas Cremoso", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "Frankfurt Viena Pavo", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "Yogur Limon", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "Griego Natural", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "14 Estaciones", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "+Prot Natilla Choco", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "Fritada Pisto", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.0 + }, + { + "producto": "112 Huevos Camperos", + "fecha_estimada": "23/04/2025", + "dias_hasta": -366, + "frecuencia_dias": 7.5 + }, + { + "producto": "Cebolla Dulce", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.0 + }, + { + "producto": "Burger Espinacas", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.0 + }, + { + "producto": "Uva Roja S/S", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.0 + }, + { + "producto": "Pan M. 55% Centeno", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.7 + }, + { + "producto": "Griego Limón", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.8 + }, + { + "producto": "Queso Cheddar Loncha", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.9 + }, + { + "producto": "Pan M 35% Avena", + "fecha_estimada": "24/04/2025", + "dias_hasta": -365, + "frecuencia_dias": 8.9 + }, + { + "producto": "Cebolla Tubo", + "fecha_estimada": "25/04/2025", + "dias_hasta": -364, + "frecuencia_dias": 9.0 + }, + { + "producto": "Zumo Fresco 1/2 L", + "fecha_estimada": "25/04/2025", + "dias_hasta": -364, + "frecuencia_dias": 9.7 + }, + { + "producto": "Q Rallado Fundir", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.0 + }, + { + "producto": "Hummus Clasico", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.2 + }, + { + "producto": "Rebuenas", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.4 + }, + { + "producto": "Mantequilla Past.Con", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.5 + }, + { + "producto": "Café Cleche D.Gusto", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.9 + }, + { + "producto": "Yogur Sabor Coco", + "fecha_estimada": "26/04/2025", + "dias_hasta": -363, + "frecuencia_dias": 10.9 + }, + { + "producto": "Tortilla Pat C/Ceb", + "fecha_estimada": "27/04/2025", + "dias_hasta": -362, + "frecuencia_dias": 11.2 + }, + { + "producto": "Patata Roja", + "fecha_estimada": "27/04/2025", + "dias_hasta": -362, + "frecuencia_dias": 11.9 + }, + { + "producto": "Zanahoria Bolsa", + "fecha_estimada": "28/04/2025", + "dias_hasta": -361, + "frecuencia_dias": 12.0 + }, + { + "producto": "Queso Vaca Havarti", + "fecha_estimada": "28/04/2025", + "dias_hasta": -361, + "frecuencia_dias": 12.2 + }, + { + "producto": "Croissant Rell Cacao", + "fecha_estimada": "28/04/2025", + "dias_hasta": -361, + "frecuencia_dias": 12.4 + }, + { + "producto": "Lenteja", + "fecha_estimada": "29/04/2025", + "dias_hasta": -360, + "frecuencia_dias": 13.0 + }, + { + "producto": "Choc 85% Cacao", + "fecha_estimada": "29/04/2025", + "dias_hasta": -360, + "frecuencia_dias": 13.5 + }, + { + "producto": "Limpiador Dentadura", + "fecha_estimada": "29/04/2025", + "dias_hasta": -360, + "frecuencia_dias": 13.5 + }, + { + "producto": "Seta Laminada", + "fecha_estimada": "29/04/2025", + "dias_hasta": -360, + "frecuencia_dias": 13.8 + }, + { + "producto": "Tom. Receta Artesana", + "fecha_estimada": "29/04/2025", + "dias_hasta": -360, + "frecuencia_dias": 13.9 + }, + { + "producto": "Queso Cottage", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.0 + }, + { + "producto": "Judia Redonda 500 G", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.0 + }, + { + "producto": "Tiburon", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.0 + }, + { + "producto": "Digestive Avena Choc", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.0 + }, + { + "producto": "Papel Higienico 4 Ca", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.5 + }, + { + "producto": "Leche Semi P6", + "fecha_estimada": "30/04/2025", + "dias_hasta": -359, + "frecuencia_dias": 14.9 + }, + { + "producto": "Caldo Verduras 12 P.", + "fecha_estimada": "01/05/2025", + "dias_hasta": -358, + "frecuencia_dias": 15.0 + }, + { + "producto": "Choco Gotas Fundir", + "fecha_estimada": "01/05/2025", + "dias_hasta": -358, + "frecuencia_dias": 15.0 + }, + { + "producto": "16 Huevos Camperos", + "fecha_estimada": "01/05/2025", + "dias_hasta": -358, + "frecuencia_dias": 15.0 + }, + { + "producto": "Gall Digestive", + "fecha_estimada": "01/05/2025", + "dias_hasta": -358, + "frecuencia_dias": 15.5 + }, + { + "producto": "Nuez Natural", + "fecha_estimada": "01/05/2025", + "dias_hasta": -358, + "frecuencia_dias": 15.7 + }, + { + "producto": "Judía Plana 750 Gr", + "fecha_estimada": "02/05/2025", + "dias_hasta": -357, + "frecuencia_dias": 16.0 + }, + { + "producto": "Calabaza Trozos", + "fecha_estimada": "02/05/2025", + "dias_hasta": -357, + "frecuencia_dias": 16.3 + }, + { + "producto": "Cafe Molido Natural", + "fecha_estimada": "02/05/2025", + "dias_hasta": -357, + "frecuencia_dias": 16.6 + }, + { + "producto": "Cuidacol Natural", + "fecha_estimada": "03/05/2025", + "dias_hasta": -356, + "frecuencia_dias": 17.0 + }, + { + "producto": "Solomillo Añojo", + "fecha_estimada": "03/05/2025", + "dias_hasta": -356, + "frecuencia_dias": 17.5 + }, + { + "producto": "Esp Verde Fino", + "fecha_estimada": "04/05/2025", + "dias_hasta": -355, + "frecuencia_dias": 18.0 + }, + { + "producto": "Zanahoria 500 G", + "fecha_estimada": "04/05/2025", + "dias_hasta": -355, + "frecuencia_dias": 18.2 + }, + { + "producto": "Tofu", + "fecha_estimada": "04/05/2025", + "dias_hasta": -355, + "frecuencia_dias": 18.3 + }, + { + "producto": "Mandarina 2 Kg", + "fecha_estimada": "05/05/2025", + "dias_hasta": -354, + "frecuencia_dias": 19.4 + }, + { + "producto": "Crema Tex-Mex", + "fecha_estimada": "06/05/2025", + "dias_hasta": -353, + "frecuencia_dias": 20.8 + }, + { + "producto": "Pan De Pueblo", + "fecha_estimada": "07/05/2025", + "dias_hasta": -352, + "frecuencia_dias": 21.0 + }, + { + "producto": "Mozzarella Fresca", + "fecha_estimada": "07/05/2025", + "dias_hasta": -352, + "frecuencia_dias": 21.0 + }, + { + "producto": "Burger Berenjena", + "fecha_estimada": "07/05/2025", + "dias_hasta": -352, + "frecuencia_dias": 21.0 + }, + { + "producto": "Pan 12 Cereal/Semill", + "fecha_estimada": "07/05/2025", + "dias_hasta": -352, + "frecuencia_dias": 21.0 + }, + { + "producto": "Plátano Manzana 120G", + "fecha_estimada": "08/05/2025", + "dias_hasta": -351, + "frecuencia_dias": 22.0 + }, + { + "producto": "Fresa Arándanos Aven", + "fecha_estimada": "08/05/2025", + "dias_hasta": -351, + "frecuencia_dias": 22.0 + }, + { + "producto": "Fresa Platano 120G", + "fecha_estimada": "08/05/2025", + "dias_hasta": -351, + "frecuencia_dias": 22.0 + }, + { + "producto": "Mezcla 4 Quesos", + "fecha_estimada": "08/05/2025", + "dias_hasta": -351, + "frecuencia_dias": 22.7 + }, + { + "producto": "Pistacho Tost 0% Sal", + "fecha_estimada": "09/05/2025", + "dias_hasta": -350, + "frecuencia_dias": 23.3 + }, + { + "producto": "Gall Digestive Avena", + "fecha_estimada": "10/05/2025", + "dias_hasta": -349, + "frecuencia_dias": 24.0 + }, + { + "producto": "Pan Campeon Mundo", + "fecha_estimada": "10/05/2025", + "dias_hasta": -349, + "frecuencia_dias": 24.2 + }, + { + "producto": "Q Mitad Semi", + "fecha_estimada": "10/05/2025", + "dias_hasta": -349, + "frecuencia_dias": 24.5 + }, + { + "producto": "Margarina Con Sal", + "fecha_estimada": "10/05/2025", + "dias_hasta": -349, + "frecuencia_dias": 24.5 + }, + { + "producto": "Pan Moño", + "fecha_estimada": "11/05/2025", + "dias_hasta": -348, + "frecuencia_dias": 25.0 + }, + { + "producto": "Ajo Seco 250 G", + "fecha_estimada": "11/05/2025", + "dias_hasta": -348, + "frecuencia_dias": 25.7 + }, + { + "producto": "Soja Con Chocolate", + "fecha_estimada": "13/05/2025", + "dias_hasta": -346, + "frecuencia_dias": 27.0 + }, + { + "producto": "Gall Digestive Choco", + "fecha_estimada": "13/05/2025", + "dias_hasta": -346, + "frecuencia_dias": 27.5 + }, + { + "producto": "Dátil Sin Hueso", + "fecha_estimada": "13/05/2025", + "dias_hasta": -346, + "frecuencia_dias": 27.5 + }, + { + "producto": "Leche Semi Calcio", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "Uva Blanca S/Sem", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "+ Proteínas Flan", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "Cebolla Roja", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "Atun Claro Natural", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "Mermelada Fresa", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.0 + }, + { + "producto": "Queso Emmental Taco", + "fecha_estimada": "14/05/2025", + "dias_hasta": -345, + "frecuencia_dias": 28.7 + }, + { + "producto": "Levadura Panaderia", + "fecha_estimada": "15/05/2025", + "dias_hasta": -344, + "frecuencia_dias": 29.0 + }, + { + "producto": "Seta Bandeja", + "fecha_estimada": "15/05/2025", + "dias_hasta": -344, + "frecuencia_dias": 29.0 + }, + { + "producto": "Arroz Sos", + "fecha_estimada": "16/05/2025", + "dias_hasta": -343, + "frecuencia_dias": 30.3 + }, + { + "producto": "Hogaza Centeno 50%", + "fecha_estimada": "17/05/2025", + "dias_hasta": -342, + "frecuencia_dias": 31.0 + }, + { + "producto": "Nata Para Cocinar", + "fecha_estimada": "19/05/2025", + "dias_hasta": -340, + "frecuencia_dias": 33.0 + }, + { + "producto": "Crema 100% Cacahuete", + "fecha_estimada": "19/05/2025", + "dias_hasta": -340, + "frecuencia_dias": 33.0 + }, + { + "producto": "Salsa De Soja Salada", + "fecha_estimada": "20/05/2025", + "dias_hasta": -339, + "frecuencia_dias": 34.0 + }, + { + "producto": "Tortillas Mexicanas", + "fecha_estimada": "20/05/2025", + "dias_hasta": -339, + "frecuencia_dias": 34.0 + }, + { + "producto": "P. Pav Red. Sal Bipa", + "fecha_estimada": "21/05/2025", + "dias_hasta": -338, + "frecuencia_dias": 35.0 + }, + { + "producto": "Fresh 0%Alcohol Enj.", + "fecha_estimada": "21/05/2025", + "dias_hasta": -338, + "frecuencia_dias": 35.0 + }, + { + "producto": "Pañuelo Locion", + "fecha_estimada": "21/05/2025", + "dias_hasta": -338, + "frecuencia_dias": 35.0 + }, + { + "producto": "Cebolla 2 Kg", + "fecha_estimada": "21/05/2025", + "dias_hasta": -338, + "frecuencia_dias": 35.0 + }, + { + "producto": "Ravioli Req.Espinaca", + "fecha_estimada": "21/05/2025", + "dias_hasta": -338, + "frecuencia_dias": 35.0 + }, + { + "producto": "Macarron", + "fecha_estimada": "24/05/2025", + "dias_hasta": -335, + "frecuencia_dias": 38.5 + }, + { + "producto": "Caramelo Eucaliptus", + "fecha_estimada": "24/05/2025", + "dias_hasta": -335, + "frecuencia_dias": 38.5 + }, + { + "producto": "Croissant", + "fecha_estimada": "27/05/2025", + "dias_hasta": -332, + "frecuencia_dias": 41.0 + }, + { + "producto": "Miel De Flores Kg", + "fecha_estimada": "28/05/2025", + "dias_hasta": -331, + "frecuencia_dias": 42.0 + }, + { + "producto": "Azúcar Moreno 1Kg", + "fecha_estimada": "28/05/2025", + "dias_hasta": -331, + "frecuencia_dias": 42.0 + }, + { + "producto": "Medialunas Calabaza", + "fecha_estimada": "28/05/2025", + "dias_hasta": -331, + "frecuencia_dias": 42.0 + }, + { + "producto": "Batido Cacao Energy", + "fecha_estimada": "28/05/2025", + "dias_hasta": -331, + "frecuencia_dias": 42.0 + }, + { + "producto": "Azucar", + "fecha_estimada": "28/05/2025", + "dias_hasta": -331, + "frecuencia_dias": 42.0 + }, + { + "producto": "Cacao Puro 0%", + "fecha_estimada": "10/06/2025", + "dias_hasta": -318, + "frecuencia_dias": 55.0 + }, + { + "producto": "Espinaca Picada", + "fecha_estimada": "11/06/2025", + "dias_hasta": -317, + "frecuencia_dias": 56.0 + }, + { + "producto": "Pan Sem Y P Calabaza", + "fecha_estimada": "11/06/2025", + "dias_hasta": -317, + "frecuencia_dias": 56.0 + }, + { + "producto": "11 Corazon Romana", + "fecha_estimada": "17/06/2025", + "dias_hasta": -311, + "frecuencia_dias": 62.0 + }, + { + "producto": "Caramelos Lima 0%", + "fecha_estimada": "17/06/2025", + "dias_hasta": -311, + "frecuencia_dias": 62.0 + }, + { + "producto": "Pan Tostado Clasico", + "fecha_estimada": "17/06/2025", + "dias_hasta": -311, + "frecuencia_dias": 62.0 + }, + { + "producto": "Galleta Canela", + "fecha_estimada": "24/06/2025", + "dias_hasta": -304, + "frecuencia_dias": 69.0 + }, + { + "producto": "Spaghetti", + "fecha_estimada": "25/06/2025", + "dias_hasta": -303, + "frecuencia_dias": 70.0 + }, + { + "producto": "Salsa Fresca Quesos", + "fecha_estimada": "25/06/2025", + "dias_hasta": -303, + "frecuencia_dias": 70.0 + }, + { + "producto": "Vela Te Chai", + "fecha_estimada": "01/07/2025", + "dias_hasta": -297, + "frecuencia_dias": 76.0 + }, + { + "producto": "Champu Extra Suave", + "fecha_estimada": "01/07/2025", + "dias_hasta": -297, + "frecuencia_dias": 76.0 + }, + { + "producto": "Grana Padano Escamas", + "fecha_estimada": "08/07/2025", + "dias_hasta": -290, + "frecuencia_dias": 83.0 + }, + { + "producto": "Coca-Cola 12 Latas", + "fecha_estimada": "09/07/2025", + "dias_hasta": -289, + "frecuencia_dias": 84.0 + }, + { + "producto": "Vaselina Aroma Framb", + "fecha_estimada": "09/07/2025", + "dias_hasta": -289, + "frecuencia_dias": 84.0 + }, + { + "producto": "Nidos Al Huevo", + "fecha_estimada": "22/07/2025", + "dias_hasta": -276, + "frecuencia_dias": 97.0 + } +]; diff --git a/escanear_productos.html b/escanear_productos.html new file mode 100644 index 0000000..418787f --- /dev/null +++ b/escanear_productos.html @@ -0,0 +1,90 @@ + + + + + + Escáner de Productos + + + + +

Escanear Producto

+ + + + +
+ + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/generar_lista.py b/generar_lista.py new file mode 100644 index 0000000..f68c4c6 --- /dev/null +++ b/generar_lista.py @@ -0,0 +1,110 @@ +""" +generar_lista.py +Genera datos.js con predicciones de compra limpias a partir de lista_compra_estimado.csv +Uso: python generar_lista.py +""" +import pandas as pd +import json +import re +from datetime import datetime + +# --------------------------------------------------------------------------- +# Filtros de basura (líneas del ticket que no son productos) +# --------------------------------------------------------------------------- +BAD_PATTERNS = [ + r'^\s*%', + r'tarjeta', + r'^total(\s|$|\s*\()', + r'€/kg', + r'\d+,\d+\s*kg', + r'^n\.c', + r'^aut[\s\d]', + r'verificado', + r'visa', + r'bancaria', + r'devoluciones', + r'mastercard', + r'importe', + r'^iva\s', + r'^cuota\s', + r'^\d+,\d+\s*€', # líneas de precio suelto + r'^\d{1,3}\s*€', # líneas tipo "15 €" +] + +def es_basura(nombre): + n = nombre.lower().strip() + if not n or len(n) < 3: + return True + return any(re.search(p, n) for p in BAD_PATTERNS) + +def limpiar_nombre(nombre): + nombre = nombre.strip() + # Quitar el "1" pegado al inicio del nombre que viene de la cantidad en el ticket + # "1Yogur Limon" → "Yogur Limon" | "1+Prot Pud" → "+Prot Pud" + # Pero "16 Huevos Camperos" → "16 Huevos Camperos" (es un pack de 16 huevos) + nombre = re.sub(r'^1([A-ZÁÉÍÓÚÑ+a-záéíóúñ])', r'\1', nombre) + return nombre.strip() + +# --------------------------------------------------------------------------- +# Cargar datos +# --------------------------------------------------------------------------- +try: + # Intentar UTF-8 primero, si falla usar cp1252 (Windows) + try: + df = pd.read_csv('lista_compra_estimado.csv', encoding='utf-8') + except UnicodeDecodeError: + df = pd.read_csv('lista_compra_estimado.csv', encoding='cp1252') +except FileNotFoundError: + print("❌ No se encontró lista_compra_estimado.csv") + print(" Ejecuta primero: python autocompra5.py (o autocompra7.py)") + exit(1) + +print(f" Productos en CSV: {len(df)}") + +# Filtrar basura +df = df[~df['producto'].apply(es_basura)].copy() +print(f" Después de filtrar basura: {len(df)}") + +# Limpiar nombres +df['nombre'] = df['producto'].apply(limpiar_nombre) + +# Parsear fechas estimadas +df['fecha'] = pd.to_datetime(df['fecha_estimada_proxima_compra'], format='%d/%m/%Y', errors='coerce') +df = df.dropna(subset=['fecha', 'diferencia_dias']) +# Excluir productos sin frecuencia real (frecuencia = 0 significa comprado una sola vez) +df = df[df['diferencia_dias'] > 0] + +# Eliminar duplicados (mismo nombre → quedarse con el de menor frecuencia, más fiable) +df = df.sort_values('diferencia_dias') +df = df.drop_duplicates(subset='nombre', keep='first') + +# Calcular días hasta la próxima compra desde HOY +hoy = pd.Timestamp(datetime.now().date()) +df['dias_hasta'] = (df['fecha'] - hoy).dt.days + +# Ordenar: primero los más frecuentes (más urgentes a recoger), luego por fecha estimada +df = df.sort_values(['diferencia_dias', 'dias_hasta']) + +# --------------------------------------------------------------------------- +# Construir JSON de salida +# --------------------------------------------------------------------------- +resultado = [] +for _, row in df.iterrows(): + resultado.append({ + 'producto': row['nombre'], + 'fecha_estimada': row['fecha_estimada_proxima_compra'], + 'dias_hasta': int(row['dias_hasta']), + 'frecuencia_dias': round(float(row['diferencia_dias']), 1), + }) + +# Escribir datos.js (cargable como + - + \ No newline at end of file diff --git a/servidor/guardar_producto.php b/servidor/guardar_producto.php new file mode 100644 index 0000000..3dcaabe --- /dev/null +++ b/servidor/guardar_producto.php @@ -0,0 +1,40 @@ + 'Datos incompletos']); + exit; +} + +try { + $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + // Insertar el producto + $stmt = $pdo->prepare("INSERT INTO productos (nombre, marca_id, ean, precio, cantidad) VALUES (:nombre, :marca_id, :ean, :precio, :cantidad)"); + $stmt->execute([ + ':nombre' => $data['nombre'], + ':marca_id' => !empty($data['marca_id']) ? $data['marca_id'] : null, + ':ean' => $data['ean'], + ':precio' => !empty($data['precio']) ? $data['precio'] : null, + ':cantidad' => !empty($data['cantidad']) ? $data['cantidad'] : null + ]); + + echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]); +} catch (PDOException $e) { + http_response_code(500); + echo json_encode(['error' => $e->getMessage()]); +} +?> diff --git a/tickets/20250424 Mercadona 166,83 €.pdf b/tickets/20250424 Mercadona 166,83 €.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61295c48fa752b5659c0b1c970cda1818ac2314a GIT binary patch literal 34828 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 nW>q#Eg8gD_0saVJKbh%Lc$0 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 literal 0 HcmV?d00001 diff --git a/tickets/20250430 Mercadona 148,40 €.pdf b/tickets/20250430 Mercadona 148,40 €.pdf new file mode 100644 index 0000000000000000000000000000000000000000..475ec03c7720f94d481ce3c0392329f14e10049a GIT binary patch literal 34591 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%0A{I8*f9X(XB34EvCo@wk6Bm0YBIf^oa{fbO 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 KkyMsK{(k_)N7bwV literal 0 HcmV?d00001