Capítulo 12: Gran Apertura (Proyecto Integrador)
Llegaste al final del entrenamiento, Gerente. Aprendiste a construir estantes (Listas), etiquetar cajas (Variables), contratar empleados (Funciones) y organizar rutas de archivos (Pathlib). Es un salto real desde donde empezaste.
Este capítulo no tiene lección. Es la Gran Apertura. Tu misión: construir el Sistema de Gestión de Inventario (SGI) v1.0 desde cero.

Fig. 12.1: Arquitectura del SGI v1.0: el bucle principal y sus módulos.
El Reto
Sin guías paso a paso. Sin espacios en blanco para rellenar. Tienes el plano arquitectónico (Fig. 12.1) y tus herramientas. Tú construyes el edificio.
El programa que vas a crear administra el flujo real de mercancías desde una consola. Nada de botones, nada de ventanas emergentes. La interfaz es el teclado y cada acción tiene consecuencias reales sobre los datos del almacén.
Requisitos del Sistema
- Interfaz de Mando: Un menú infinito que permita al usuario elegir acciones hasta que decida “Salir”.
- Memoria Persistente: “Si cierro el programa y lo abro mañana, mis productos deben seguir ahí” (guardados en
inventario.json). - Gestión de Productos: Poder agregar, listar, buscar y eliminar productos del inventario.
- Entrada Blindada: Si el usuario escribe texto donde va un número, o intenta cantidades negativas, el programa no colapsa: rechaza el dato y vuelve a preguntar.
Estructura de Datos
Cada producto es un Diccionario y el inventario es una Lista de esos diccionarios. Este es el esquema oficial de la entidad Producto:
| Campo | Tipo | Descripción |
|---|---|---|
id | str | Identificador único |
nombre | str | Nombre descriptivo |
precio | float | Valor unitario |
stock | int | Cantidad disponible |
{"id": "1", "nombre": "Tornillos", "precio": 5.5, "stock": 500}
El inventario completo se guarda en inventario.json, que conserva la estructura tal cual la tienes en memoria: una lista de diccionarios.
[
{"id": "1", "nombre": "Tornillos", "precio": 5.5, "stock": 500}
]
Nota: ¿y las clases? Quizá hayas oído que en Python los objetos se modelan con clases (POO). Aquí, a propósito, no las usamos: un producto es un diccionario y el inventario una lista de diccionarios. Es una decisión de diseño deliberada: para un sistema de este tamaño, funciones más diccionarios es de sobra, y te deja ver el flujo de datos sin capas extra encima. Las clases son tu siguiente gran tema, y el Capítulo 14 te dice por dónde seguir.
Arquitectura Recomendada
Tu archivo inventario.py debe implementar estas funciones clave (SOP):
-
cargar_datos(ruta: Path) -> list[dict]: Al iniciar el programa, busca el archivoinventario.json. Si existe, lo lee conjson.loady devuelve la lista de diccionarios. Si no, devuelve una lista vacía. -
guardar_datos(ruta: Path, inventario: list[dict]) -> None: Toma la lista actual y sobrescribeinventario.jsonconjson.dump. -
agregar_producto(inventario: list[dict], nombre: str, precio: float, stock: int) -> dict: Crea el diccionario con un ID nuevo y agrégalo a la lista. Reto: que el sistema no acepte precios ni stock negativos. Puedes rechazarlos aquí o en la ventanilla que pide los datos; la implementación de referencia lo resuelve en la ventanilla (Guía 4). -
buscar_producto(inventario: list[dict], id_producto: str) -> dict | None: Recorre la lista y devuelve el producto con ese ID, oNonesi no existe. (Eso significa la firmadict | None: un diccionario o nada.) -
eliminar_producto(inventario: list[dict], id_producto: str) -> list[dict]: Devuelve la lista sin el producto indicado. Reto: tras eliminar, los IDs nuevos no deben repetir los ya usados. -
mostrar_reporte(inventario: list[dict]) -> None: Recorre la lista e imprime un reporte con los stocks actuales. -
main(): El cerebro. Un buclewhile Trueque muestra el menú y usamatch-casepara llamar a las funciones anteriores según lo que elija el usuario. Importante: ¡No olvides guardar antes de salir!
Lista de Verificación de Calidad
Antes de entregar tu proyecto, verifica:
- ¿Tengo el
venvactivado? - ¿Tengo Type Hints en todas mis funciones?
- ¿Uso f-strings para los textos?
- ¿Mi código está limpio y comentado?
Nota: ¿atascado? Primero inténtalo solo: el aprendizaje ocurre mientras resuelves, no mientras lees la solución. Pero si llevas un buen rato girando en círculos, las Guías de Referencia desarman el proyecto pieza por pieza:
¡Buena suerte, Gerente! El almacén es tuyo.