import json
import os
class Producto:
"""
Representa un artículo del inventario con capacidad de serialización.
"""
def __init__(self, nombre, cantidad, punto_reorden):
self.nombre = nombre
self.cantidad = cantidad
self.punto_reorden = punto_reorden
def to_dict(self):
"""Convierte el objeto en un diccionario para guardar en JSON."""
return {
"nombre": self.nombre,
"cantidad": self.cantidad,
"punto_reorden": self.punto_reorden
}
def __str__(self):
estado = "OK" if self.cantidad > self.punto_reorden else "¡REABASTECER!"
return f"[{estado:12}] {self.nombre:20} | Stock: {self.cantidad:5} | Mínimo: {self.punto_reorden:5}"
class Inventario:
"""
Gestiona la lógica de productos y la persistencia en disco.
"""
ARCHIVO = "inventario_db.json"
def __init__(self):
self.productos = {}
self._cargar_desde_disco()
def _guardar_en_disco(self):
"""Guarda el estado actual del inventario en un archivo JSON."""
datos = {nombre: p.to_dict() for nombre, p in self.productos.items()}
with open(self.ARCHIVO, 'w', encoding='utf-8') as f:
json.dump(datos, f, indent=4, ensure_ascii=False)
def _cargar_desde_disco(self):
"""Carga los datos del archivo JSON si existe."""
if os.path.exists(self.ARCHIVO):
try:
with open(self.ARCHIVO, 'r', encoding='utf-8') as f:
datos = json.load(f)
for item in datos.values():
nuevo_p = Producto(item['nombre'], item['cantidad'], item['punto_reorden'])
self.productos[nuevo_p.nombre.lower()] = nuevo_p
except Exception as e:
print(f"⚠️ No se pudo cargar el archivo: {e}")
def agregar_nuevo_producto(self):
"""Solicita datos, crea el producto y guarda automáticamente."""
print("\n--- Registro de Nuevo Producto ---")
nombre = input("Nombre del producto: ").strip()
try:
cantidad = int(input(f"Cantidad inicial: "))
reorden = int(input(f"Punto de reorden (exigencia): "))
nuevo_p = Producto(nombre, cantidad, reorden)
self.productos[nombre.lower()] = nuevo_p
self._guardar_en_disco() # <--- Guardado automático
print(f"✅ '{nombre}' guardado en base de datos.")
except ValueError:
print("❌ Error: Use números enteros para cantidad y reorden.")
def mostrar_estado(self):
"""Muestra el reporte actual de exigencias."""
print("\n" + "="*60)
print(f"{'REPORTE DE EXIGENCIAS ACTUALES':^60}")
print("="*60)
if not self.productos:
print("Inventario vacío. Agregue productos primero.")
else:
for p in self.productos.values():
print(p)
if p.cantidad <= p.punto_reorden:
print(f" ⚠️ EXIGENCIA: Reponer {p.nombre}")
print("="*60)
# --- Interfaz de Usuario ---
def ejecutar_sistema():
sistema = Inventario()
while True:
print("\n📦 GESTIÓN DE INVENTARIOS")
print("1. Registrar/Actualizar producto")
print("2. Ver exigencias y stock")
print("3. Salir")
opcion = input("Seleccione: ")
if opcion == "1":
sistema.agregar_nuevo_producto()
elif opcion == "2":
sistema.mostrar_estado()
elif opcion == "3":
print("Cerrando sistema. Datos protegidos.")
break
if __name__ == "__main__":
ejecutar_sistema()