Initial commit: job tracker automation script
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user