import json
import os
import hashlib
import functools
from datetime import datetime
from collections import Counter
# --- DECORADOR DE SEGURIDAD ---
def auditar_y_restringir(rol_requerido: str):
def decorador(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
if not self.usuario_actual or self.usuario_actual['rol'] != rol_requerido:
print(f"🚫 ACCESO DENEGADO. Se requiere rol: {rol_requerido}")
return
resultado = func(self, *args, **kwargs)
with open("auditoria_total.txt", "a", encoding="utf-8") as f:
f.write(f"[{datetime.now()}] {self.usuario_actual['nombre']} ejecutó {func.__name__}\n")
return resultado
return wrapper
return decorador
# --- CLASE MAESTRA ---
class EmpresaApp:
def __init__(self):
self.archivo_datos = "empresa_data.json"
self.usuarios = {}
self.usuario_actual = None
# 1. GESTOR DE CONTEXTO (Magia de archivos)
def __enter__(self):
if os.path.exists(self.archivo_datos):
with open(self.archivo_datos, 'r') as f:
self.usuarios = json.load(f)
else:
pwd_h = hashlib.sha256("admin123".encode()).hexdigest()
self.usuarios = {"admin": {"nombre": "admin", "pwd": pwd_h, "rol": "Admin", "pedidos": []}}
return self
def __exit__(self, tipo, valor, traza):
with open(self.archivo_datos, 'w') as f:
json.dump(self.usuarios, f, indent=4)
print("\n[Sistema] Sesión cerrada y datos protegidos.")
# 2. MÉTODO MÁGICO: __len__ (Conteo de usuarios)
def __len__(self):
"""Permite usar len(app) para saber cuántos usuarios existen"""
return len(self.usuarios)
# 3. MÉTODO MÁGICO: __getitem__ (Acceso rápido)
def __getitem__(self, nombre_usuario):
"""Permite usar app['nombre'] para obtener datos de un usuario"""
return self.usuarios.get(nombre_usuario, "Usuario no encontrado")
def _encriptar(self, pwd: str):
return hashlib.sha256(pwd.encode()).hexdigest()
def login(self):
nombre = input("Usuario: ")
pwd = input("Contraseña: ")
user = self.usuarios.get(nombre)
if user and user['pwd'] == self._encriptar(pwd):
self.usuario_actual = user
return True
return False
@auditar_y_restringir("Admin")
def crear_usuario(self):
nombre = input("Nuevo usuario: ")
rol = input("Rol (Admin/Empleado): ")
pwd = input("Contraseña: ")
self.usuarios[nombre] = {"nombre": nombre, "pwd": self._encriptar(pwd), "rol": rol, "pedidos": []}
print(f"👤 Usuario {nombre} creado con éxito.")
@auditar_y_restringir("Empleado")
def gestionar_pedido(self):
prods = input("Productos (coma): ").split(",")
conteo = dict(Counter([p.strip() for p in prods]))
self.usuario_actual['pedidos'].append({"fecha": str(datetime.now()), "items": conteo})
print("📦 Pedido registrado.")
# --- MENÚ PRINCIPAL ---
def ejecutar_menu():
with EmpresaApp() as app:
if not app.login():
print("❌ Credenciales inválidas.")
return
while True:
print(f"\n--- SISTEMA EMPRESA ({app.usuario_actual['rol']}) ---")
print(f"Total usuarios registrados: {len(app)}") # <--- AQUÍ USAMOS __len__
print("1. Crear Usuario")
print("2. Registrar Pedido")
print("3. Consultar Usuario (Acceso rápido)")
print("4. Salir")
op = input("Seleccione: ")
if op == "1": app.crear_usuario()
elif op == "2": app.gestionar_pedido()
elif op == "3":
# USAMOS __getitem__
nombre = input("Nombre a consultar: ")
print(f"Datos: {app[nombre]}")
elif op == "4": break
if __name__ == "__main__":
ejecutar_menu()