Capítulo 12: Mini Proyecto Integrador
¡Llegó el momento más emocionante! 🎉 Es hora de construir tu obra maestra de Python combinando todas las herramientas que has dominado. Imagina que eres el encargado de un almacén moderno donde cada concepto aprendido se convierte en una pieza fundamental de un sistema completo y funcional.
🏗️ El Proyecto: Sistema de Gestión de Almacén
Vamos a crear un Sistema de Gestión de Almacén que use TODOS los conceptos que has aprendido hasta ahora:
📋 ¿Qué hará nuestro sistema?
- Gestionar inventario con diccionarios y listas
- Procesar ventas con funciones y control de flujo
- Generar reportes guardándolos en archivos CSV
- Validar datos con manejo de errores
- Automatizar tareas como respaldos y alertas
🧰 Conceptos que integraremos
- ✅ Variables y tipos de datos → Información de productos
- ✅ Operadores → Cálculos de precios y totales
- ✅ Estructuras de control → Lógica de negocio
- ✅ Listas y diccionarios → Base de datos en memoria
- ✅ Funciones → Operaciones reutilizables
- ✅ Manejo de archivos → Persistencia de datos
- ✅ Manejo de errores → Sistema robusto
🚀 Desarrollo del Proyecto
Paso 1: Estructura de Datos del Almacén
Primero, definamos cómo representaremos nuestro almacén usando las estructuras de datos que conocemos:
# Base de datos del almacén (usando diccionarios y listas)
inventario = {
"PROD001": {
"nombre": "Laptop HP",
"precio": 15000.00,
"stock": 5,
"categoria": "Electrónicos",
"proveedor": "TechCorp"
},
"PROD002": {
"nombre": "Mouse Inalámbrico",
"precio": 350.00,
"stock": 20,
"categoria": "Accesorios",
"proveedor": "GadgetCo"
},
"PROD003": {
"nombre": "Monitor 24 pulgadas",
"precio": 4500.00,
"stock": 8,
"categoria": "Electrónicos",
"proveedor": "ScreenTech"
}
}
# Registro de ventas (lista de diccionarios)
ventas = []
# Configuración del sistema
configuracion = {
"iva": 0.16,
"descuento_mayoreo": 0.10,
"stock_minimo": 5,
"archivo_ventas": "ventas_almacen.csv",
"archivo_inventario": "inventario_respaldo.json"
}
Paso 2: Funciones de Operación
Creemos las funciones principales que harán funcionar nuestro almacén:
import json
import csv
from datetime import datetime
def mostrar_inventario():
"""Muestra todo el inventario actual del almacén"""
print("\n" + "="*50)
print("📦 INVENTARIO DEL ALMACÉN")
print("="*50)
for codigo, producto in inventario.items():
print(f"\nCódigo: {codigo}")
print(f" Nombre: {producto['nombre']}")
print(f" Precio: ${producto['precio']:,.2f}")
print(f" Stock: {producto['stock']} unidades")
print(f" Categoría: {producto['categoria']}")
# Alerta de stock bajo usando condicionales
if producto['stock'] <= configuracion['stock_minimo']:
print(f" 🚨 ALERTA: Stock bajo!")
def buscar_producto(codigo):
"""Busca un producto por código"""
if codigo in inventario:
return inventario[codigo]
else:
return None
def calcular_precio_venta(codigo, cantidad):
"""Calcula el precio final de una venta con IVA y descuentos"""
producto = buscar_producto(codigo)
if not producto:
return None, "Producto no encontrado"
if cantidad > producto['stock']:
return None, f"Stock insuficiente. Disponible: {producto['stock']}"
# Cálculo del precio base
precio_base = producto['precio'] * cantidad
# Aplicar descuento por mayoreo (si compra 10 o más)
if cantidad >= 10:
descuento = precio_base * configuracion['descuento_mayoreo']
precio_con_descuento = precio_base - descuento
print(f"💰 Descuento por mayoreo aplicado: ${descuento:,.2f}")
else:
precio_con_descuento = precio_base
descuento = 0
# Calcular IVA
iva = precio_con_descuento * configuracion['iva']
precio_final = precio_con_descuento + iva
return {
'precio_base': precio_base,
'descuento': descuento,
'iva': iva,
'precio_final': precio_final
}, "OK"
def registrar_venta(codigo, cantidad, cliente="Cliente general"):
"""Registra una venta en el sistema"""
try:
# Calcular precios
calculo, mensaje = calcular_precio_venta(codigo, cantidad)
if calculo is None:
print(f"❌ Error: {mensaje}")
return False
# Crear registro de venta
venta = {
'fecha': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'codigo_producto': codigo,
'nombre_producto': inventario[codigo]['nombre'],
'cantidad': cantidad,
'precio_unitario': inventario[codigo]['precio'],
'precio_base': calculo['precio_base'],
'descuento': calculo['descuento'],
'iva': calculo['iva'],
'precio_final': calculo['precio_final'],
'cliente': cliente
}
# Agregar a lista de ventas
ventas.append(venta)
# Actualizar stock
inventario[codigo]['stock'] -= cantidad
print(f"\n✅ Venta registrada exitosamente")
print(f"Cliente: {cliente}")
print(f"Producto: {venta['nombre_producto']}")
print(f"Cantidad: {cantidad}")
print(f"Total: ${calculo['precio_final']:,.2f}")
return True
except Exception as e:
print(f"❌ Error al registrar venta: {e}")
return False
def generar_reporte_ventas():
"""Genera un reporte completo de ventas"""
if not ventas:
print("📊 No hay ventas registradas")
return
print("\n" + "="*60)
print("📊 REPORTE DE VENTAS")
print("="*60)
total_ventas = 0
total_iva = 0
productos_vendidos = {}
# Procesar cada venta usando bucles
for venta in ventas:
total_ventas += venta['precio_final']
total_iva += venta['iva']
# Contabilizar productos vendidos
codigo = venta['codigo_producto']
if codigo in productos_vendidos:
productos_vendidos[codigo] += venta['cantidad']
else:
productos_vendidos[codigo] = venta['cantidad']
print(f"Total de ventas: {len(ventas)}")
print(f"Ingresos totales: ${total_ventas:,.2f}")
print(f"IVA recaudado: ${total_iva:,.2f}")
print("\n📈 Productos más vendidos:")
# Ordenar productos por cantidad vendida
productos_ordenados = sorted(productos_vendidos.items(),
key=lambda x: x[1], reverse=True)
for codigo, cantidad in productos_ordenados:
nombre = inventario[codigo]['nombre']
print(f" • {nombre}: {cantidad} unidades")
def exportar_ventas_csv():
"""Exporta las ventas a un archivo CSV"""
try:
with open(configuracion['archivo_ventas'], 'w', newline='', encoding='utf-8') as archivo:
campos = ['fecha', 'codigo_producto', 'nombre_producto', 'cantidad',
'precio_unitario', 'precio_base', 'descuento', 'iva',
'precio_final', 'cliente']
escritor = csv.DictWriter(archivo, fieldnames=campos)
escritor.writeheader()
for venta in ventas:
escritor.writerow(venta)
print(f"✅ Ventas exportadas a {configuracion['archivo_ventas']}")
except Exception as e:
print(f"❌ Error al exportar ventas: {e}")
def respaldar_inventario():
"""Crea un respaldo del inventario en JSON"""
try:
respaldo = {
'fecha_respaldo': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'inventario': inventario,
'configuracion': configuracion
}
with open(configuracion['archivo_inventario'], 'w', encoding='utf-8') as archivo:
json.dump(respaldo, archivo, indent=2, ensure_ascii=False)
print(f"✅ Inventario respaldado en {configuracion['archivo_inventario']}")
except Exception as e:
print(f"❌ Error al respaldar inventario: {e}")
def cargar_respaldo():
"""Carga un respaldo del inventario"""
try:
with open(configuracion['archivo_inventario'], 'r', encoding='utf-8') as archivo:
respaldo = json.load(archivo)
global inventario
inventario = respaldo['inventario']
print("✅ Respaldo cargado exitosamente")
print(f"Fecha del respaldo: {respaldo['fecha_respaldo']}")
except FileNotFoundError:
print("❌ No se encontró archivo de respaldo")
except Exception as e:
print(f"❌ Error al cargar respaldo: {e}")
Paso 3: Sistema de Menús Interactivo
Ahora creemos la interfaz principal que permite al usuario interactuar con todas las funciones:
def mostrar_menu():
"""Muestra el menú principal del sistema"""
print("\n" + "="*50)
print("🏪 SISTEMA DE GESTIÓN DE ALMACÉN")
print("="*50)
print("1. 📦 Ver inventario")
print("2. 🔍 Buscar producto")
print("3. 💰 Registrar venta")
print("4. 📊 Reporte de ventas")
print("5. 📁 Exportar ventas a CSV")
print("6. 💾 Respaldar inventario")
print("7. 📂 Cargar respaldo")
print("8. ➕ Agregar producto")
print("9. 🚪 Salir")
print("-" * 50)
def agregar_producto():
"""Permite agregar un nuevo producto al inventario"""
try:
print("\n➕ AGREGAR NUEVO PRODUCTO")
print("-" * 30)
codigo = input("Código del producto: ").upper()
# Validar que el código no exista
if codigo in inventario:
print("❌ Error: El código ya existe")
return
nombre = input("Nombre del producto: ")
precio = float(input("Precio: $"))
stock = int(input("Stock inicial: "))
categoria = input("Categoría: ")
proveedor = input("Proveedor: ")
# Validaciones básicas
if precio <= 0:
print("❌ Error: El precio debe ser mayor a 0")
return
if stock < 0:
print("❌ Error: El stock no puede ser negativo")
return
# Agregar al inventario
inventario[codigo] = {
"nombre": nombre,
"precio": precio,
"stock": stock,
"categoria": categoria,
"proveedor": proveedor
}
print(f"✅ Producto {nombre} agregado exitosamente")
except ValueError:
print("❌ Error: Ingresa valores numéricos válidos")
except Exception as e:
print(f"❌ Error inesperado: {e}")
def ejecutar_sistema():
"""Función principal que ejecuta el sistema completo"""
print("🎉 ¡Bienvenido al Sistema de Gestión de Almacén!")
print("Este sistema integra todos los conceptos de Python que has aprendido.")
while True:
mostrar_menu()
try:
opcion = input("\nSelecciona una opción (1-9): ")
if opcion == "1":
mostrar_inventario()
elif opcion == "2":
codigo = input("Ingresa el código del producto: ").upper()
producto = buscar_producto(codigo)
if producto:
print(f"\n🎯 Producto encontrado:")
print(f"Nombre: {producto['nombre']}")
print(f"Precio: ${producto['precio']:,.2f}")
print(f"Stock: {producto['stock']}")
print(f"Categoría: {producto['categoria']}")
else:
print("❌ Producto no encontrado")
elif opcion == "3":
codigo = input("Código del producto: ").upper()
cantidad = int(input("Cantidad: "))
cliente = input("Nombre del cliente (opcional): ") or "Cliente general"
registrar_venta(codigo, cantidad, cliente)
elif opcion == "4":
generar_reporte_ventas()
elif opcion == "5":
exportar_ventas_csv()
elif opcion == "6":
respaldar_inventario()
elif opcion == "7":
cargar_respaldo()
elif opcion == "8":
agregar_producto()
elif opcion == "9":
print("\n👋 ¡Gracias por usar el Sistema de Gestión de Almacén!")
print("¡Has completado exitosamente tu proyecto integrador!")
break
else:
print("❌ Opción inválida. Selecciona del 1 al 9.")
except ValueError:
print("❌ Error: Ingresa un número válido")
except KeyboardInterrupt:
print("\n\n👋 Sistema cerrado por el usuario")
break
except Exception as e:
print(f"❌ Error inesperado: {e}")
print("El sistema continuará funcionando...")
# Pausa para que el usuario pueda leer los resultados
input("\nPresiona Enter para continuar...")
# ¡Ejecutar el sistema!
if __name__ == "__main__":
ejecutar_sistema()
🎯 Análisis del Proyecto: ¿Qué has logrado?
Conceptos Integrados Exitosamente:
1. Variables y Tipos de Datos ✅
- Diccionarios para productos, configuración
- Listas para ventas
- Strings, floats, integers, booleans
2. Operadores ✅
- Aritméticos: cálculos de precios, IVA, descuentos
- Comparación: validaciones de stock, precios
- Lógicos: condiciones complejas
3. Estructuras de Control ✅
- if/elif/else: validaciones, alertas, descuentos
- for: procesar ventas, mostrar inventario
- while: menú principal interactivo
4. Estructuras de Datos ✅
- Diccionarios: inventario, productos, configuración
- Listas: registro de ventas
- Operaciones: búsqueda, ordenamiento, filtrado
5. Funciones ✅
- Modularización del código
- Parámetros y valores de retorno
- Manejo de errores localizado
6. Manejo de Archivos ✅
- CSV: exportación de ventas
- JSON: respaldos del inventario
- Encoding UTF-8: soporte para caracteres especiales
7. Manejo de Errores ✅
- try/except: captura de errores
- Validaciones: datos de entrada
- Mensajes informativos: experiencia de usuario
8. Automatización ✅
- Respaldos automáticos
- Cálculos automáticos de precios
- Generación automática de reportes
🏆 ¡Felicitaciones!
Has creado un sistema completo y funcional que demuestra el dominio de todos los conceptos fundamentales de Python. Este proyecto:
- ✅ Es realista: Simula un caso de uso del mundo real
- ✅ Es completo: Integra todos los conceptos aprendidos
- ✅ Es escalable: Puedes agregar más funcionalidades
- ✅ Es educativo: Refuerza el aprendizaje práctico
💡 Ideas para Expandir el Proyecto:
- Agregar más validaciones de datos de entrada
- Crear categorías dinámicas de productos
- Implementar alertas automáticas por email
- Agregar gráficos con matplotlib
- Crear una interfaz web con Flask
🎓 Reflexión Final
Con este proyecto has demostrado que puedes:
- 🧠 Pensar como programador: Dividir problemas complejos en funciones simples
- 🔧 Usar las herramientas correctas: Elegir la estructura de datos apropiada
- 🛡️ Crear código robusto: Manejar errores y validar datos
- 🎨 Diseñar experiencias: Crear interfaces amigables
- 📈 Resolver problemas reales: Automatizar tareas del mundo real
¡Ya no eres un principiante, eres un programador Python! 🐍✨
¿Listo para los siguientes desafíos? El mundo de la programación está lleno de oportunidades esperándote…