#!/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()