Cesta de la compra

    ¿Qué queremos construir?

    Estamos creando un carrito de la compra para una tienda de comestibles en línea.  La idea de esta kata es construir el producto de forma iterativa.

    Requisitos técnicos

    • El precio por unidad se calcula a partir del coste del producto y del porcentaje de ingresos que la empresa desea para ese producto.
    • El precio debe redondearse al alza; así, si el precio unitario calculado es de 1,7825, el precio unitario previsto para ese producto será de 1,79.
    • El precio final del producto se calcula entonces como el precio por unidad con el IVA redondeado al alza.
    • No se permite que los productos tengan el mismo nombre.

    Listado de productos

    Nombre Precio % Ingresos Precio por unidad Impuestos Precio final
    Lechuga 🥬 1.55 € 15 % 1,79 € Normal (21%) 2.17 €
    Tomate 🍅 0.52 € 15 % 0.60 € Normal (21%) 0.73 €
    Pollo 🍗 1.34 € 12 % 1.51 € Normal (21%) 1.83 €
    Pan 🍞 0.71 € 12 % 0.80 € First necessity (10%) 0.88 €
    Maíz 🌽 1.21 € 12 % 1.36 € First necessity (10%) 1.50 €

    Listado de descuentos

    Código de descuento Porcentaje de descuento
    PROMO_5 5%
    PROMO_10 10%

     

    Casos prácticos

    Lista de la cesta de la compra

    Como cliente
    Quiero ver mi cesta de la compra

    Cesta vacía

    --------------------------------------------
    | Producto | Precio con IVA | Cantidad |
    | ----------- | -------------- | -------- |
    |------------------------------------------|
    | Promoción: |
    --------------------------------------------
    | Total de productos: 0 |
    | Precio total: 0.00 € |
    --------------------------------------------


    Añadir productos a la cesta de la compra

    Como cliente
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir tomate 🍅 a mi carrito de envío
    Quiero añadir pollo 🍗 a mi carrito de envío
    Quiero añadir pan 🍞 a mi cesta de envío
    Quiero añadir maíz 🌽 a mi cesta de envío
    Quiero ver mi pedido
    --------------------------------------------
    | Producto | Price con IVA | Cantidad |
    | ----------- | -------------- | -------- |
    | Lechuga 🥬 | 2.17 € | 1 |
    | Tomate 🍅 | 0.73 € | 1 |
    | Pollo 🍗 | 1.83 € | 1 |
    | Pan 🍞 | 0.88 € | 1 |
    | Maíz 🌽 | 1.50 € | 1 |
    |------------------------------------------|
    | Promoción: |
    --------------------------------------------
    | Total productos: 5 |
    | Precio total: 7.11 € |
    --------------------------------------------

    Añadir productos a la cesta de la compra

    Como cliente
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir tomate 🍅 a mi carrito de envío
    Quiero añadir pollo 🍗 a mi carrito de envío
    Quiero añadir pan 🍞 a mi cesta de envío
    Quiero añadir pan 🍞 a mi cesta de envío
    Quiero añadir maíz 🌽 a mi cesta de envío
    Quiero ver mi pedido

     

    --------------------------------------------
    | Producto | Precio con IVA | Cantidad |
    | ----------- | -------------- | -------- |
    | Lechuga 🥬 | 2.17 € | 3 |
    | Tomate 🍅 | 0.73 € | 1 |
    | Pollo 🍗 | 1.83 € | 1 |
    | Pan 🍞 | 0.88 € | 2 |
    | Maíz 🌽 | 1.50 € | 1 |
    |------------------------------------------|
    | Promoción: |
    --------------------------------------------
    | Total productos: 8 |
    | Precio total: 12.33 € |
    --------------------------------------------

     

    Aplicar descuento a la cesta de la compra

    Como cliente
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir lechuga 🥬 a mi cesta de envío
    Quiero añadir tomate 🍅 a mi carrito de envío
    Quiero añadir pollo 🍗 a mi carrito de envío
    Quiero añadir pan 🍞 a mi cesta de envío
    Quiero añadir pan 🍞 a mi cesta de envío
    Quiero añadir maíz 🌽 a mi cesta de envío
    Quiero aplicar mi cupón descuento PROMO_5
    Quiero ver mi pedido
    --------------------------------------------
    | Producto. | Precio con IVA | Cantidad |
    | ----------- | -------------- | -------- |
    | Lechuga 🥬 | 2.17 € | 3 |
    | Tomate 🍅 | 0.73 € | 1 |
    | Pollo 🍗 | 1.83 € | 1 |
    | Pan 🍞 | 0.88 € | 2 |
    | Maíz 🌽 | 1.50 € | 1 |
    |------------------------------------------|
    | Promoción: 5% de descuento PROMO_5 |
    --------------------------------------------
    | Total productos: 8 |
    | Total price: 11.71 € |
    --------------------------------------------

    API posible para la cesta de la compra

    Esta API se puede modificar, este es sólo un ejemplo.

    Enfoque 1: pasar objetos como argumentos podría ser DTO

    public interface ShoppingCart {
    public void addItem(Product product);
    public void deletItem(Product product);
    public void applyDiscount(Discount discount)
    public void printShoppingCart();
    }

    Enfoque 2: pasar primitivas como argumentos
     
    public interface ShoppingCart {
    public void addItem(String productName);
    public void deletItem(String productName);
    public void applyDiscount(Double discount)
    public void printShoppingCart();
    }

    Enfoque 3: pasar primitivas como argumentos y
    devolver un DTO

    public
    interface ShoppingCart {
    public void addItem(String productName);
    public void deletItem(String productName);
    public void applyDiscount(Double discount)
    public ShoppingCartList getShoppingCart();
    }

    Aviso

    Los ejemplos gráficos que ves son una referencia de cómo funciona la kata, no tienes que aplicarlos si no quieres.