From 678053b16c620613d9acb964e211dc56f2d63f3e Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 14 Feb 2026 18:07:13 +0000 Subject: [PATCH] Actualizar robot.js --- robot.js | 90 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 29 deletions(-) diff --git a/robot.js b/robot.js index 5cb18fd..7b4e914 100644 --- a/robot.js +++ b/robot.js @@ -49,6 +49,12 @@ async function runMultiasistencia(ownerId, user, pass) { const links = Array.from(document.querySelectorAll('a[href*="reparacion="]')); return Array.from(new Set(links.map(a => a.href.match(/reparacion=(\d+)/)?.[1]).filter(Boolean))); }); + + // --- MEJORA: ARCHIVADO --- + if (expedientes.length > 0) { + await syncAndArchive(ownerId, 'multiasistencia', expedientes); + } + for (const ref of expedientes) { await page.goto(`https://web.multiasistencia.com/w3multi/repasos1.php?reparacion=${ref}`, { waitUntil: 'domcontentloaded' }); await page.waitForTimeout(1500); @@ -70,23 +76,23 @@ async function runMultiasistencia(ownerId, user, pass) { if (descHeader && descHeader.nextElementSibling) rawDesc = clean(descHeader.nextElementSibling.innerText); const idxDate = rawDesc.search(/\b\d{2}\/\d{2}\/\d{4}\b/); const cleanDesc = idxDate !== -1 ? rawDesc.substring(0, idxDate).trim() : rawDesc; - // ... (dentro de runMultiasistencia - evaluate) -const rawCPField = findByCab("Distrito Postal") || ""; -const cpMatch = rawCPField.match(/\b\d{5}\b/); -const cpOnly = cpMatch ? cpMatch[0] : ""; -const popOnly = rawCPField.replace(cpOnly, '').replace('-', '').trim(); + + const rawCPField = findByCab("Distrito Postal") || ""; + const cpMatch = rawCPField.match(/\b\d{5}\b/); + const cpOnly = cpMatch ? cpMatch[0] : ""; + const popOnly = rawCPField.replace(cpOnly, '').replace('-', '').trim(); -return { - "Expediente": findByCab("Número Reparación") || "", - "Nombre Cliente": findByCab("Nombre Cliente") || "", - "Dirección": findByCab("Dirección") || "", - "Población": popOnly, - "Código Postal": cpOnly, // CAMPO RECUPERADO - "Compañía": "MULTI - " + (findByCab("Procedencia") || "MULTIASISTENCIA"), - "Descripción": cleanDesc, - "Teléfono": phoneMatch ? phoneMatch[0] : "", - "Urgente": findByCab("Urgente") || "No" -}; + return { + "Expediente": findByCab("Número Reparación") || "", + "Nombre Cliente": findByCab("Nombre Cliente") || "", + "Dirección": findByCab("Dirección") || "", + "Población": popOnly, + "Código Postal": cpOnly, + "Compañía": "MULTI - " + (findByCab("Procedencia") || "MULTIASISTENCIA"), + "Descripción": cleanDesc, + "Teléfono": (document.body.innerText.match(/[6789]\d{8}/) || [])[0] || "", + "Urgente": findByCab("Urgente") || "No" + }; }); if (scrapData && scrapData['Nombre Cliente']) break; } catch (e) { continue; } @@ -106,7 +112,6 @@ async function runHomeserve(ownerId, user, pass) { console.log("🌍 [HomeServe] Entrando..."); await page.goto('https://www.clientes.homeserve.es/cgi-bin/fccgi.exe?w3exec=PROF_PASS', { timeout: 60000 }); - // Login if (await page.isVisible('input[name="CODIGO"]')) { await page.fill('input[name="CODIGO"]', user); await page.fill('input[type="password"]', pass); @@ -114,42 +119,40 @@ async function runHomeserve(ownerId, user, pass) { await page.waitForTimeout(5000); } - // Navegar al listado real (Usando la URL de tu log) await page.goto('https://www.clientes.homeserve.es/cgi-bin/fccgi.exe?w3exec=lista_servicios_total'); await page.waitForTimeout(3000); - // EXTRAER LISTA DE EXPEDIENTES const refs = await page.evaluate(() => { const cells = Array.from(document.querySelectorAll('td')); const found = []; cells.forEach(td => { - const match = td.innerText.trim().match(/^15\d{6}$/); // Refs de HomeServe suelen ser 15XXXXXX + const match = td.innerText.trim().match(/^15\d{6}$/); if (match) found.push(match[0]); }); return [...new Set(found)]; }); + // --- MEJORA: ARCHIVADO --- + if (refs.length > 0) { + await syncAndArchive(ownerId, 'homeserve', refs); + } + console.log(`🔍 [HomeServe] ${refs.length} expedientes detectados.`); for (const ref of refs) { - // Ir al detalle directo await page.goto(`https://www.clientes.homeserve.es/cgi-bin/fccgi.exe?w3exec=ver_servicioencurso&Servicio=${ref}`); await page.waitForTimeout(2000); const scrapData = await page.evaluate(() => { const d = {}; - const clean = (t) => t ? t.replace(/\s+/g, ' ').trim() : ""; const rows = Array.from(document.querySelectorAll('tr')); - rows.forEach(r => { const cells = r.querySelectorAll('td'); if (cells.length >= 2) { const k = cells[0].innerText.toUpperCase().trim().replace(':', ''); const v = cells[1].innerText.trim(); - if (k.includes("COMENTARIOS")) { const txt = cells[1].querySelector('textarea')?.value || ""; - // Filtro quirúrgico de descripción const cleanDesc = txt.split('\n').filter(line => { const l = line.toUpperCase(); return !["CAMBIO DE ESTADO", "ESTADO ASIGNADO", "SMS NO ENVIADO", "CONTACTO CON PROF", "0000"].some(b => l.includes(b)); @@ -160,8 +163,6 @@ async function runHomeserve(ownerId, user, pass) { } } }); - - // Separar Población y CP de HomeServe const rawPop = d['POBLACION-PROVINCIA'] || ""; const cpMatch = rawPop.match(/\b\d{5}\b/); d['Código Postal'] = cpMatch ? cpMatch[0] : ""; @@ -169,7 +170,6 @@ async function runHomeserve(ownerId, user, pass) { d['Compañía'] = "HOME - " + (d['COMPAÑIA'] || "HOMESERVE"); d['Nombre Cliente'] = d['CLIENTE'] || ""; d['Dirección'] = d['DOMICILIO'] || ""; - return d; }); @@ -181,13 +181,45 @@ async function runHomeserve(ownerId, user, pass) { finally { await browser.close(); } } +// --- NUEVA FUNCIÓN: SINCRONIZACIÓN Y ARCHIVADO --- +async function syncAndArchive(ownerId, provider, currentWebRefs) { + const client = await pool.connect(); + try { + const { rows: dbServices } = await client.query( + `SELECT service_ref FROM scraped_services + WHERE owner_id = $1 AND provider = $2 AND status = 'pending'`, + [ownerId, provider] + ); + + const refsToArchive = dbServices + .map(s => s.service_ref) + .filter(ref => !currentWebRefs.includes(ref)); + + if (refsToArchive.length > 0) { + await client.query( + `UPDATE scraped_services + SET status = 'archived' + WHERE owner_id = $1 + AND provider = $2 + AND service_ref = ANY($3)`, + [ownerId, provider, refsToArchive] + ); + console.log(`📦 [${provider.toUpperCase()}] Archivados ${refsToArchive.length} expedientes desaparecidos.`); + } + } catch (error) { + console.error(`❌ Error archivando ${provider}:`, error.message); + } finally { + client.release(); + } +} + async function saveServiceToDB(ownerId, provider, ref, data) { console.log(`💾 Guardando ${provider.toUpperCase()} ${ref}...`); await pool.query(` INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, status) VALUES ($1, $2, $3, $4, 'pending') ON CONFLICT (owner_id, provider, service_ref) - DO UPDATE SET raw_data = EXCLUDED.raw_data, created_at = NOW() + DO UPDATE SET raw_data = EXCLUDED.raw_data, created_at = NOW(), status = 'pending' `, [ownerId, provider, ref, JSON.stringify(data)]); }