From 03737d02fd14fcefa37794c92799cbbb5fea023d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Bra=C3=B1a?= Date: Sun, 10 May 2026 19:51:35 +0200 Subject: [PATCH] Initial commit: job tracker automation script --- job_tracker_automation.py | 132 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 job_tracker_automation.py diff --git a/job_tracker_automation.py b/job_tracker_automation.py new file mode 100644 index 0000000..258b93b --- /dev/null +++ b/job_tracker_automation.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +# job_tracker_automation.py - Script para generar tu tabla de seguimiento de empleo +# Requisitos: pip install openpyxl requests beautifulsoup4 (opcional para scraping real) + +import openpyxl +from openpyxl.styles import Font, Alignment, PatternFill +from datetime import datetime, timedelta +import hashlib +import os + +def create_or_load_workbook(filepath="Busqueda_Empleo_Y_Trabajo_Extra.xlsx"): + """Crea un nuevo workbook o carga uno existente""" + if os.path.exists(filepath): + wb = openpyxl.load_workbook(filepath) + else: + wb = openpyxl.Workbook() + # Eliminar hoja por defecto si existe + if "Sheet" in wb.sheetnames: + wb.remove(wb["Sheet"]) + return wb + +def setup_worksheet(wb, sheet_name, headers): + """Configura una hoja con headers y formato""" + if sheet_name in wb.sheetnames: + ws = wb[sheet_name] + else: + ws = wb.create_sheet(title=sheet_name) + + # Escribir headers si la hoja está vacía + if ws.max_row == 1 and ws.cell(row=1, column=1).value is None: + for col_num, header in enumerate(headers, 1): + cell = ws.cell(row=1, column=col_num) + cell.value = header + cell.font = Font(bold=True) + cell.alignment = Alignment(horizontal="center", vertical="center") + cell.fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid") + return ws + +def add_unique_entry(worksheet, new_entry, unique_columns=None): + """ + Añade una entrada solo si no existe ya (basado en columnas únicas) + unique_columns: lista de índices de columnas que hacen única una entrada (0-based) + """ + if unique_columns is None: + unique_columns = [0, 5] # Por defecto: Fecha + URL + + # Crear hash de las columnas únicas para comparación rápida + new_hash = hashlib.md5( + "".join(str(new_entry[i]) for i in unique_columns).encode() + ).hexdigest() + + # Verificar si ya existe + for row in worksheet.iter_rows(min_row=2, values_only=True): + existing_hash = hashlib.md5( + "".join(str(row[i]) for i in unique_columns if i < len(row)).encode() + ).hexdigest() + if existing_hash == new_hash: + return False # Ya existe, no agregar + + # No existe, agregar + worksheet.append(new_entry) + return True + +def main(): + # Configuración de tus hojas + MAIN_JOB_HEADERS = [ + "Fecha", "País/Región", "Ciudad", "Puesto", "Empresa/Organización", + "Compensación Total Estimada", "Link/URL", "Estado", "Comentario" + ] + + EXTRA_WORK_HEADERS = [ + "Fecha", "Tipo de trabajo", "Plataforma/Cliente", "Descripción breve", + "Ingreso estimado (€/mes)", "Estado", "Link/Nota de seguimiento", "Tiempo invertido (h/sem)" + ] + + # Ruta del archivo (cambia si lo guardas en otro lugar) + EXCEL_FILE = "/home/javi/.openclaw/workspace/Busqueda_Empleo_Y_Trabajo_Extra.xlsx" + + # Cargar o crear workbook + wb = create_or_load_workbook(EXCEL_FILE) + + # Configurar hojas + main_ws = setup_worksheet(wb, "Busqueda_Principal_Global", MAIN_JOB_HEADERS) + extra_ws = setup_worksheet(wb, "Trabajo_Extra_Online", EXTRA_WORK_HEADERS) + + # === EJEMPLO: Cómo añadir nuevas entradas sin duplicados === + # En la práctica, aquí iría tu lógica de scraping o entrada manual + + # Ejemplo de nueva oferta de trabajo (evita duplicados por Fecha + URL) + new_job = [ + "2026-05-13", # Fecha + "Estados Unidos", # País/Región + "California (San Francisco)", # Ciudad + "Senior Renewable Energy Project Manager", # Puesto + "NextEra Energy Resources", # Empresa + "$140,000 base + 20% target bonus + equity", # Compensación + "https://www.nexteraenergy.com/careers/job/senior-renewable-energy-project-manager-san-francisco-ca/12345", # URL + "Pendiente", # Estado + "Requerirá visa L-1 o H-1B, paquete de reubicación disponible" # Comentario + ] + + # Añadir solo si no existe (usando columnas 0=Fecha y 6=URL como únicas) + if add_unique_entry(main_ws, new_job, unique_columns=[0, 6]): + print(f"✅ Nueva oferta añadida: {new_job[3]} en {new_job[4]}") + else: + print(f"⚠️ Duplicado detectado y omitido: {new_job[3]}") + + # Ejemplo de nuevo trabajo extra (evita duplicados por Fecha + Descripción) + new_extra = [ + "2026-05-13", # Fecha + "Consultoría técnica", # Tipo de trabajo + "Freelancer.com", # Plataforma + "Revisión de estudio de impacto ambiental para parque eólico en México", # Descripción + 350, # Ingreso estimado + "Propuesta enviada", # Estado + "https://www.freelancer.com/projects/...", # Link + 4 # Tiempo invertido + ] + + if add_unique_entry(extra_ws, new_extra, unique_columns=[0, 3]): + print(f"✅ Nuevo trabajo extra añadido: {new_extra[1]} - {new_extra[3][:50]}...") + else: + print(f"⚠️ Duplicado de trabajo extra detectado: {new_extra[1]}") + + # Guardar workbook + wb.save(EXCEL_FILE) + print(f"\n📊 Archivo actualizado: {EXCEL_FILE}") + print(f" - {main_ws.max_row - 1} oportunidades de empleo registradas") + print(f" - {extra_ws.max_row - 1} trabajos extra registrados") + +if __name__ == "__main__": + main() \ No newline at end of file