From 0fac382d4da58619ca538476b18a05fe31cd2638 Mon Sep 17 00:00:00 2001 From: marsalva Date: Tue, 6 Jan 2026 23:12:09 +0000 Subject: [PATCH] Actualizar worker-multi-estado.js --- worker-multi-estado.js | 72 ++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/worker-multi-estado.js b/worker-multi-estado.js index 30555c0..b20532c 100644 --- a/worker-multi-estado.js +++ b/worker-multi-estado.js @@ -1,4 +1,4 @@ -// worker-multi-estado.js (V5 - CON FOTO DE DIAGNÓSTICO) +// worker-multi-estado.js (V6 - LOG COMPLETO DE DATOS) 'use strict'; const { chromium } = require('playwright'); @@ -92,7 +92,6 @@ async function processChangeState(page, db, jobData) { console.log(`📂 Abriendo servicio ${serviceNumber}...`); await page.goto(targetUrl, { waitUntil: 'domcontentloaded', timeout: 60000 }); - // Esperar formulario await page.waitForSelector('select.answer-select', { timeout: 20000 }); await page.waitForTimeout(1500); @@ -154,8 +153,7 @@ async function processChangeState(page, db, jobData) { console.log('💾 Click en Guardar...'); await btn.click(); - // 8. GESTIÓN DE ALERTAS (EL MOMENTO CRÍTICO) - // Esperamos más tiempo para asegurar que el popup carga + // 8. GESTIÓN DE ALERTAS await page.waitForTimeout(3000); const confirmBtn = page.locator('button.form-container-button-submit-toast').filter({ hasText: 'Sí' }); @@ -164,27 +162,20 @@ async function processChangeState(page, db, jobData) { console.log('🚨 ALERTA SMS DETECTADA. Pulsando "Sí"...'); await confirmBtn.click(); - // ¡OJO! Esperar a que el botón DESAPAREZCA (Confirmación de que el click funcionó) try { await confirmBtn.waitFor({ state: 'hidden', timeout: 5000 }); - console.log('✅ Botón "Sí" ha desaparecido (Click exitoso).'); + console.log('✅ Botón "Sí" ha desaparecido.'); } catch(e) { - console.log('⚠️ El botón "Sí" sigue ahí. Forzando segundo click...'); - await confirmBtn.click(); // Re-intentar + console.log('⚠️ Forzando segundo click en "Sí"...'); + await confirmBtn.click(); } - - // Espera larga para el guardado real del servidor await page.waitForTimeout(5000); - } else { - console.log('ℹ️ No saltó la alerta de SMS (o ya se procesó).'); } - // 9. VERIFICACIÓN FINAL + CAPTURA DE PANTALLA - // Hacemos una captura ahora mismo para ver qué demonios hay en la pantalla + // 9. VERIFICACIÓN FINAL + FOTO const screenshotBuffer = await page.screenshot({ fullPage: true, quality: 50, type: 'jpeg' }); const screenshotBase64 = screenshotBuffer.toString('base64'); - // Analizamos texto const finalResult = await page.evaluate(() => { const successEl = document.querySelector('.form-container-success') || document.querySelector('.bg-success'); const errorEl = document.querySelector('.form-container-error') || document.querySelector('.bg-danger'); @@ -197,15 +188,14 @@ async function processChangeState(page, db, jobData) { console.log(`🏁 RESULTADO: [${finalResult.type}]`); - // Devolvemos el resultado y LA FOTO return { success: (finalResult.type === 'OK' || finalResult.text.includes('correctamente')), message: finalResult.text, - screenshot: screenshotBase64 // <-- LA PRUEBA DEL DELITO + screenshot: screenshotBase64 }; } -// --- WORKER LOOP --- +// --- WORKER LOOP (ACTUALIZADO PARA GUARDAR INFO) --- async function claimJobById(db, jobId) { const ref = db.collection(CONFIG.QUEUE_COLLECTION).doc(jobId); return await db.runTransaction(async (tx) => { @@ -216,23 +206,49 @@ async function claimJobById(db, jobId) { }); } -async function markJobDone(db, jobId, result) { - // Guardamos la foto en el log +// ✅ MODIFICADO: Ahora recibe el objeto 'job' completo para guardar sus datos +async function markJobDone(db, job, result) { + const jobId = job.id; + // 1. Actualizamos el estado en la cola await db.collection(CONFIG.QUEUE_COLLECTION).doc(jobId).set({ status: 'DONE', result }, { merge: true }); + + // 2. Guardamos el LOG COMPLETO con los datos de entrada await db.collection(CONFIG.RESULT_COLLECTION).add({ jobId, - ok: true, - ...result, // Aquí va la screenshot + ok: true, + // Datos del servicio enviados: + serviceNumber: job.serviceNumber || '', + reason: job.reasonValue || '', + comment: job.comment || '', + date: job.dateStr || '', + time: job.timeStr || '', + // Resultado del robot: + ...result, // Incluye screenshot y message createdAt: toServerTimestamp() }); } -async function markJobFailed(db, jobId, err) { +// ✅ MODIFICADO: También guardamos los datos si falla, para saber qué provocó el error +async function markJobFailed(db, job, err) { + const jobId = job.id; await db.collection(CONFIG.QUEUE_COLLECTION).doc(jobId).set({ status: 'FAILED', error: { message: err.message } }, { merge: true }); - await db.collection(CONFIG.RESULT_COLLECTION).add({ jobId, ok: false, error: err.message, createdAt: toServerTimestamp() }); + + await db.collection(CONFIG.RESULT_COLLECTION).add({ + jobId, + ok: false, + // Datos del servicio: + serviceNumber: job.serviceNumber || '', + reason: job.reasonValue || '', + comment: job.comment || '', + date: job.dateStr || '', + time: job.timeStr || '', + // Error: + error: err.message, + createdAt: toServerTimestamp() + }); } async function processJob(db, job) { @@ -246,12 +262,14 @@ async function processJob(db, job) { dateStr: job.dateStr, timeStr: job.timeStr }); - await markJobDone(db, job.id, res); + // Pasamos el objeto 'job' entero + await markJobDone(db, job, res); console.log(`✅ Job ${job.id} Completado.`); }); } catch (err) { console.error(`❌ Job ${job.id} Falló:`, err.message); - await markJobFailed(db, job.id, err); + // Pasamos el objeto 'job' entero + await markJobFailed(db, job, err); } } @@ -263,7 +281,7 @@ function startWorker(db) { db.collection(CONFIG.QUEUE_COLLECTION).where('status', '==', 'PENDING').onSnapshot(s => { s.docChanges().forEach(c => { if(c.type==='added') { queue.push(c.doc.id); run(); } }); }); - console.log('🚀 Worker Multiasistencia (V5 - CON FOTO) LISTO.'); + console.log('🚀 Worker Multiasistencia (V6 - LOG COMPLETO) LISTO.'); } const db = initFirebase();