Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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?

  1. Gestionar inventario con diccionarios y listas
  2. Procesar ventas con funciones y control de flujo
  3. Generar reportes guardándolos en archivos CSV
  4. Validar datos con manejo de errores
  5. 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:

  1. Agregar más validaciones de datos de entrada
  2. Crear categorías dinámicas de productos
  3. Implementar alertas automáticas por email
  4. Agregar gráficos con matplotlib
  5. 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…