import json
import os
from typing import List, TypedDict
# Definimos la estructura del diccionario
class Empleado(TypedDict):
nombre: str
edad: int
sueldo: float
NOMBRE_ARCHIVO = "empleados.json"
def cargar_datos() -> List[Empleado]:
"""Carga los empleados desde un archivo JSON si existe."""
if os.path.exists(NOMBRE_ARCHIVO):
try:
with open(NOMBRE_ARCHIVO, 'r', encoding='utf-8') as f:
return json.load(f)
except (json.JSONDecodeError, IOError):
return []
return []
def guardar_datos(lista: List[Empleado]) -> None:
"""Guarda la lista de empleados en un archivo JSON."""
try:
with open(NOMBRE_ARCHIVO, 'w', encoding='utf-8') as f:
json.dump(lista, f, indent=4, ensure_ascii=False)
except IOError as e:
print(f"❌ Error al guardar los datos: {e}")
def obtener_nombres_mayor_sueldo(lista: List[Empleado]) -> List[str]:
"""Retorna los nombres de los empleados con el salario máximo."""
if not lista:
return []
max_sueldo = max(emp['sueldo'] for emp in lista)
return [emp['nombre'] for emp in lista if emp['sueldo'] == max_sueldo]
def menu_principal():
lista_empleados = cargar_datos()
while True:
print("\n--- SISTEMA DE NOMINA DE EMPLEADOS ---")
print("1. Agregar nuevo empleado")
print("2. Ver quién tiene el mayor sueldo")
print("3. Listar todos los empleados")
print("4. Salir y guardar")
opcion = input("Seleccione una opción: ")
if opcion == "1":
try:
nombre = input("Nombre: ").strip()
edad = int(input("Edad: "))
sueldo = float(input("Sueldo: "))
if sueldo < 0 or edad < 0:
print("❌ Error: Ni el sueldo ni la edad pueden ser negativos.")
else:
nuevo: Empleado = {"nombre": nombre, "edad": edad, "sueldo": sueldo}
lista_empleados.append(nuevo)
print(f"✅ {nombre} ha sido agregado localmente.")
except ValueError:
print("❌ Error: Ingrese valores numéricos válidos.")
elif opcion == "2":
ganadores = obtener_nombres_mayor_sueldo(lista_empleados)
if ganadores:
print(f"🏆 El mayor sueldo lo tiene: {', '.join(ganadores)}")
else:
print("No hay datos registrados.")
elif opcion == "3":
if not lista_empleados:
print("La lista está vacía.")
else:
for i, e in enumerate(lista_empleados, 1):
print(f"{i}. {e['nombre']} | Edad: {e['edad']} | Sueldo: ${e['sueldo']:.2f}")
elif opcion == "4":
guardar_datos(lista_empleados)
print("💾 Datos guardados correctamente. ¡Adiós!")
break
else:
print("Opción no válida.")
if __name__ == "__main__":
menu_principal()