diff --git a/app.py b/app.py index b88b591..6c1d4b7 100644 --- a/app.py +++ b/app.py @@ -230,6 +230,33 @@ def api_datos(): datos = json.load(f) return jsonify(datos) +# ----------------------------------------------------------------------- +# API: subir ticket PDF al servidor +# ----------------------------------------------------------------------- +@app.route("/api/subir-pdf", methods=["POST"]) +@login_required +def api_subir_pdf(): + if 'pdf' not in request.files: + return jsonify({"ok": False, "mensaje": "No se recibio ningun archivo"}), 400 + file = request.files['pdf'] + if not file or file.filename == '': + return jsonify({"ok": False, "mensaje": "Archivo vacio"}), 400 + if not file.filename.lower().endswith('.pdf'): + return jsonify({"ok": False, "mensaje": "Solo se aceptan archivos PDF"}), 400 + + pdf_bytes = file.read() + if len(pdf_bytes) > 20 * 1024 * 1024: + return jsonify({"ok": False, "mensaje": "El PDF es demasiado grande (max 20 MB)"}), 400 + + tdir = get_tickets_dir(session["usuario"]) + # Nombre seguro: eliminar caracteres problemáticos + nombre_seguro = re.sub(r'[^\w\-. ]', '_', file.filename) + dest = tdir / nombre_seguro + with open(dest, 'wb') as f: + f.write(pdf_bytes) + + return jsonify({"ok": True, "mensaje": f"PDF guardado: {nombre_seguro}"}) + # ----------------------------------------------------------------------- # API: forzar regeneracion del pipeline # ----------------------------------------------------------------------- diff --git a/templates/index.html b/templates/index.html index b5bc83c..b8e3118 100644 --- a/templates/index.html +++ b/templates/index.html @@ -278,7 +278,15 @@ async function leerPDF(file) { if (!file) return; const estado = document.getElementById('pdfEstado'); + estado.style.color = 'var(--text-muted)'; estado.textContent = 'Leyendo ' + file.name + '...'; + + // Subir al servidor en paralelo + const form = new FormData(); + form.append('pdf', file); + const subirPromise = fetch('/api/subir-pdf', { method: 'POST', body: form }); + + // Extraer texto localmente con pdf.js const pdfData = await file.arrayBuffer(); const pdf = await pdfjsLib.getDocument({ data: pdfData }).promise; let texto = ''; @@ -287,10 +295,24 @@ const content = await page.getTextContent(); texto += content.items.map(item => item.str).join(' ') + '\n'; } - estado.textContent = file.name + ' — ' + pdf.numPages + ' pagina(s)'; const salida = document.getElementById('pdfTexto'); salida.style.display = 'block'; salida.textContent = texto.trim(); + + // Resultado de la subida + try { + const res = await subirPromise; + const data = await res.json(); + if (data.ok) { + estado.textContent = '✅ ' + file.name + ' guardado en el servidor (' + pdf.numPages + ' pag.) — Pulsa "Regenerar predicciones" para actualizar.'; + } else { + estado.style.color = '#f97316'; + estado.textContent = '⚠️ ' + file.name + ' leido localmente pero no se pudo guardar en el servidor: ' + data.mensaje; + } + } catch(e) { + estado.style.color = '#f97316'; + estado.textContent = '⚠️ ' + file.name + ' leido localmente pero no se pudo subir al servidor.'; + } } // -----------------------------------------------------------------------