From 18c1df3bd534f180ca596d75c335ec944e3912f5 Mon Sep 17 00:00:00 2001 From: "brajan.aldana" Date: Thu, 17 Jul 2025 14:18:20 -0500 Subject: [PATCH] Update --- corte.mjs | 67 +++++++++++++++++++++++------------- package.json | 12 +++---- uscis.mjs | 95 ++++++++++++++++++++++++++++------------------------ 3 files changed, 101 insertions(+), 73 deletions(-) diff --git a/corte.mjs b/corte.mjs index b50841b..4d67286 100644 --- a/corte.mjs +++ b/corte.mjs @@ -297,41 +297,62 @@ async function procesarArchivo(archivo) { const datos = await obtenerDatosHoja(archivo.id); - const filasAProcesar = datos.slice(1) + const todasLasFilas = datos.slice(1) .map((row, index) => ({ valor: row[0], // Columna A fila: index + 2, // Número de fila real ultimaConsulta: row[1], // Columna B columnaC: row[2] // Columna C - })) - .filter(row => { - if (!row.columnaC) return true; // Si la columna C está vacía, procesar + })); - // Si la columna C no está vacía, verificar la fecha de última consulta en la columna B - if (!row.ultimaConsulta) return true; // Si no hay fecha en B, procesar (aunque C no esté vacía) + // Separate rows into three groups based on priority + const filasVaciasC = todasLasFilas.filter(row => !row.columnaC); - // Parsear la fecha en formato español DD/MM/YYYY - const [date, time] = row.ultimaConsulta.split(', '); - const [day, month, year] = date.split('/'); - const [hours, minutes, seconds] = time.split(':'); + const filasConFechaB = todasLasFilas.filter(row => { + if (!row.columnaC && !row.ultimaConsulta) return false; // Already handled by filasVaciasC or filasVaciasB + if (!row.ultimaConsulta) return false; // Handled by filasVaciasB - const fechaUltimaConsulta = new Date(year, month - 1, day, hours, minutes, seconds); - const ahora = new Date(); + const [date, time] = row.ultimaConsulta.split(', '); + const [day, month, year] = date.split('/'); + const [hours, minutes, seconds] = time.split(':'); - // Calcular la diferencia en horas - const diferenciaHoras = (ahora - fechaUltimaConsulta) / (1000 * 60 * 60); + const fechaUltimaConsulta = new Date(year, month - 1, day, hours, minutes, seconds); + const ahora = new Date(); - // Para fechas futuras, no procesar - if (fechaUltimaConsulta > ahora) return false; + const diferenciaHoras = (ahora - fechaUltimaConsulta) / (1000 * 60 * 60); - return diferenciaHoras > 1; // Procesar solo si ha pasado más de 1 hora - }); + if (fechaUltimaConsulta > ahora) return false; // For future dates, return false to skip processing - console.log(filasAProcesar); + return diferenciaHoras > 1; // Process only if more than 1 hour has passed + }); - console.log(`📊 Total de filas a procesar: ${filasAProcesar.length}`); + const filasVaciasB = todasLasFilas.filter(row => { + return !row.ultimaConsulta && row.columnaC; // Empty F, but G is not empty + }); - if (filasAProcesar.length > 0) { + // Sort rows with date in B by oldest date first + filasConFechaB.sort((a, b) => { + const [dateA, timeA] = a.ultimaConsulta.split(', '); + const [dayA, monthA, yearA] = dateA.split('/'); + const [hoursA, minutesA, secondsA] = timeA.split(':'); + const fechaA = new Date(yearA, monthA - 1, dayA, hoursA, minutesA, secondsA); + + const [dateB, timeB] = b.ultimaConsulta.split(', '); + const [dayB, monthB, yearB] = dateB.split('/'); + const [hoursB, minutesB, secondsB] = timeB.split(':'); + const fechaB = new Date(yearB, monthB - 1, dayB, hoursB, minutesB, secondsB); + + return fechaA - fechaB; // Ascending order (oldest first) + }); + + // Combine the arrays in the specified priority order + const filasOrdenadas = [...filasVaciasC, ...filasConFechaB, ...filasVaciasB]; + + console.log(filasOrdenadas); + + console.log(`📊 Total de filas a procesar: ${filasOrdenadas.length}`); + + if (filasOrdenadas.length > 0) { console.log('🌐 Iniciando navegador...'); let browser = await initBrowser(platform); let page = (await browser.pages())[0]; @@ -339,9 +360,9 @@ async function procesarArchivo(archivo) { const MAX_FALLOS_CONSECUTIVOS = 3; let procesadas = 0; - for (const element of filasAProcesar) { + for (const element of filasOrdenadas) { procesadas++; - console.log(`\n⏳ Procesando fila ${element.fila} (${procesadas}/${filasAProcesar.length})`); + console.log(`\n⏳ Procesando fila ${element.fila} (${procesadas}/${filasOrdenadas.length})`); console.log(`📝 Valor a consultar: ${element.valor}`); // Guardar la fecha y hora actual diff --git a/package.json b/package.json index 63d6008..8604b69 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "migracion-uscis", - "version": "1.0.0", - "main": "uscis.mjs", + "name": "migracion-corte", + "version": "1.0.1", + "main": "corte.mjs", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "electron .", @@ -10,7 +10,7 @@ "keywords": [], "author": "", "license": "ISC", - "description": "Migracion Uscis", + "description": "Migracion Corte", "dependencies": { "googleapis": "^144.0.0", "node-fetch": "^3.3.2", @@ -23,8 +23,8 @@ }, "type": "module", "build": { - "appId": "com.migracion.uscis.id", - "productName": "Migracion Uscis", + "appId": "com.migracion.corte.id", + "productName": "Migracion Corte", "win": { "target": "nsis", "icon": "path/to/icon.ico" diff --git a/uscis.mjs b/uscis.mjs index 3f2e51f..fefd4a8 100644 --- a/uscis.mjs +++ b/uscis.mjs @@ -265,56 +265,63 @@ async function procesarArchivo(archivo) { const platform_type = 'uscis'; const platform = CONFIG.PLATFORMS[platform_type.toUpperCase()].URL; - // const filasAProcesar = datos.slice(1).map((row, index) => ({ - // valor: row[4], - // fila: index + 2, - // tieneValor: !row[5], - // ultimaConsulta: row[5] || '' - // })).filter(row => { - // if (!row.ultimaConsulta) return true; - // const fechaUltimaConsulta = new Date(row.ultimaConsulta); - // const ahora = new Date(); - // const diferenciaHoras = (ahora - fechaUltimaConsulta) / (1000 * 60 * 60); - // return diferenciaHoras > 1; - // }); - - const filasAProcesar = datos.slice(1) + const todasLasFilas = datos.slice(1) .map((row, index) => ({ valor: row[4], // Columna 5 (Valor a consultar) fila: index + 2, // Número de fila real ultimaConsulta: row[5], // Columna 6 (Fecha de última consulta) resultado: row[6] // Columna 7 (Resultado) - })) - .filter(row => { - // Priorizar si la columna G (resultado) está vacía - if (!row.resultado) return true; - - // Si la columna G no está vacía, verificar la fecha en la columna F - if (!row.ultimaConsulta) return true; // Si no hay fecha en F, también se procesa (aunque G no esté vacía) - - // Parse date in Spanish format DD/MM/YYYY - const [date, time] = row.ultimaConsulta.split(', '); - const [day, month, year] = date.split('/'); - const [hours, minutes, seconds] = time.split(':'); - - const fechaUltimaConsulta = new Date(year, month - 1, day, hours, minutes, seconds); - const ahora = new Date(); - - // Calculate hours difference - const diferenciaHoras = (ahora - fechaUltimaConsulta) / (1000 * 60 * 60); - - // For future dates, return false to skip processing - if (fechaUltimaConsulta > ahora) return false; - - return diferenciaHoras > 1; // Process only if more than 1 hour has passed - }); + })); - console.log(filasAProcesar); + // Filter rows that need processing (either G is empty or F is older than 1 hour) + const filasAProcesar = todasLasFilas.filter(row => { + if (!row.resultado) return true; // Prioritize if column G (resultado) is empty + + if (!row.ultimaConsulta) return true; // If no date in F, also process (even if G is not empty) + + const [date, time] = row.ultimaConsulta.split(', '); + const [day, month, year] = date.split('/'); + const [hours, minutes, seconds] = time.split(':'); + + const fechaUltimaConsulta = new Date(year, month - 1, day, hours, minutes, seconds); + const ahora = new Date(); + + const diferenciaHoras = (ahora - fechaUltimaConsulta) / (1000 * 60 * 60); + + if (fechaUltimaConsulta > ahora) return false; // For future dates, return false to skip processing + + return diferenciaHoras > 1; // Process only if more than 1 hour has passed + }); + + // Separate rows into three groups based on priority + const filasVaciasG = filasAProcesar.filter(row => !row.resultado); + const filasVaciasF = filasAProcesar.filter(row => row.resultado && !row.ultimaConsulta); + const filasConFechaF = filasAProcesar.filter(row => row.resultado && row.ultimaConsulta); + + // Sort rows with date in F by oldest date first + filasConFechaF.sort((a, b) => { + const [dateA, timeA] = a.ultimaConsulta.split(', '); + const [dayA, monthA, yearA] = dateA.split('/'); + const [hoursA, minutesA, secondsA] = timeA.split(':'); + const fechaA = new Date(yearA, monthA - 1, dayA, hoursA, minutesA, secondsA); + + const [dateB, timeB] = b.ultimaConsulta.split(', '); + const [dayB, monthB, yearB] = dateB.split('/'); + const [hoursB, minutesB, secondsB] = timeB.split(':'); + const fechaB = new Date(yearB, monthB - 1, dayB, hoursB, minutesB, secondsB); + + return fechaA - fechaB; // Ascending order (oldest first) + }); + + // Combine the arrays in the specified priority order + const filasOrdenadas = [...filasVaciasG, ...filasConFechaF, ...filasVaciasF]; + + console.log(filasOrdenadas); - console.log(`📊 Total de filas a procesar: ${filasAProcesar.length}`); + console.log(`📊 Total de filas a procesar: ${filasOrdenadas.length}`); - if (filasAProcesar.length > 0) { + if (filasOrdenadas.length > 0) { console.log('🌐 Iniciando navegador...'); let browser = await initBrowser(platform); let page = (await browser.pages())[0]; @@ -322,9 +329,9 @@ async function procesarArchivo(archivo) { const MAX_FALLOS_CONSECUTIVOS = 3; let procesadas = 0; - for (const element of filasAProcesar) { + for (const element of filasOrdenadas) { procesadas++; - console.log(`\n⏳ Procesando fila ${element.fila} (${procesadas}/${filasAProcesar.length})`); + console.log(`\n⏳ Procesando fila ${element.fila} (${procesadas}/${filasOrdenadas.length})`); console.log(`📝 Valor a consultar: ${element.valor}`); // Guardar la fecha y hora actual @@ -345,7 +352,7 @@ async function procesarArchivo(archivo) { [fechaHoraActual] ), actualizarCelda( - archivo.id, + archivo.id, `G${element.fila}:H${element.fila}`, ['', ''] )