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.