Saltar al contenido principal

📦 Proyecto: PyZon Marketplace

En este reto debes construir el backend de una plataforma de comercio electrónico. El objetivo es demostrar dominio sobre Herencia, Polimorfismo, Encapsulamiento y Métodos Mágicos.


📋 Especificaciones Técnicas​

El sistema debe cumplir con los siguientes requisitos funcionales. Tú decides qué clases crear y cómo relacionarlas, salvo que se especifique lo contrario.

La tienda vende distintos tipos de productos. Todos tienen un nombre y un precio base. Sin embargo, el precio final que paga el cliente varía según el tipo:

  • Productos Físicos:
    • Tienen un peso (kg).
    • El precio final se calcula: Precio Base + Impuestos (21%) + Costo Envío.
    • Regla de Envío: 2€ por cada kg de peso.
  • Productos Digitales:
    • No tienen envío.
    • El precio final es simplemente el Precio Base (sin impuestos adicionales en nuestra jurisdicción, o ya incluidos).
    • Son irreversibles (no se pueden devolver).

2. Gestión de Usuarios y Cartera (Seguridad)​

El sistema debe gestionar usuarios. De cada usuario nos interesa su nombre y su Dinero Disponible.

  • Requisito de Seguridad (Encapsulamiento): El saldo del usuario NO debe ser accesible directamente (usuario.saldo = 1000 debe estar prohibido).
  • Debes proporcionar métodos seguros para:
    • depositar_saldo(cantidad): Ingresa dinero.
    • consultar_saldo(): Devuelve el saldo actual.
    • pagar(cantidad): Resta saldo solo si tiene suficiente. Si no, debe avisar del error y devolver False.

3. El Carrito de Compra (Experiencia de Uso)​

Queremos que los programadores que usen tu librería puedan gestionar el carrito de forma intuitiva usando operadores de Python:

  • Añadir productos (+):
    • Sintaxis deseada: mi_carrito + nuevo_producto
    • Acción: Añade el producto a la lista interna del carrito.
  • Contar productos (len):
    • Sintaxis deseada: len(mi_carrito)
    • Acción: Devuelve el número de artículos.
  • Finalizar Compra:
    • Debe tener un método checkout(usuario) que:
      1. Calcula el total de todos los productos (usando sus precios finales polimórficos).
      2. Intenta cobrar al usuario.
      3. Si el pago es correcto, vacía el carrito y confirma la orden.

4. La Tienda (Inventario)​

La clase principal PyZon debe organizar el inventario:

  • Debe usar un Diccionario para clasificar productos por etiquetas o categorías (ej: "Tecnología", "Hogar").
  • Debe permitir buscar productos por nombre.

🧪 Script de Validación​

Tu código debe funcionar con el siguiente script de prueba (puede requerir ajustes según tus nombres de métodos):

# 1. Configuración
tienda = PyZon()
p1 = ProductoFisico("Teclado Mecánico", precio=50, peso=1.5) # Envío: 1.5*2 = 3€ | +IVA
p2 = ProductoDigital("Licencia Windows", precio=20) # Precio fijo

tienda.registrar_producto(p1, categoria="Tecnología")
tienda.registrar_producto(p2, categoria="Software")

# 2. Usuario
user = Usuario("Alex")
user.depositar_saldo(100) # Saldo: 100€

# 3. Compra
carrito = Carrito()
carrito = carrito + p1 # Operador +
carrito = carrito + p2

print(f"Items en carrito: {len(carrito)}")

# 4. Checkout
# El costo debería ser:
# Teclado: 50 + 21%(10.5) + Envío(3) = 63.5€
# Windows: 20€
# Total: 83.5€
# El usuario tiene 100€, debería funcionar.

exito = carrito.checkout(usuario=user)
if exito:
print(f"Compra realizada. Saldo restante: {user.consultar_saldo()}€")
else:
print("Saldo insuficiente.")

¡Suerte con la arquitectura!