Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: Flujo de pedido

  • ⏱ 55 minutos
  • 📶 Nivel: intermedio

Objetivo

Escribir las cuatro reglas de negocio que cierran un pedido en el minimarket: cuánto falta para el delivery, si una dirección es aceptable, el total con delivery y el objeto del pedido que se guarda al confirmar. Son funciones puras, iguales en espíritu a las de src/motor.js.

Cómo se trabaja

La parte A se hace en tu terminal con el simulador; la parte B son cuatro funciones de JavaScript puro que se comprueban en esta página. Reglas:

💡 Reto extra

Añade direccionValida con una segunda regla: que la dirección contenga al menos un dígito (un número de calle o de casa). Piensa qué casos reales dejaría fuera («Frente al mercado») y por qué el bot de referencia prefiere una regla más simple y deja que el repartidor confirme por teléfono.

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: Soles con decimales

25 - 21.3 da 3.6999999999999993. Pasa ambos a céntimos con Math.round(x * 100), resta, y divide entre 100 al final. Si el resultado es negativo, devuelve 0.

💡 Pista 2: Direcciones

Comprueba primero typeof texto === "string" y luego texto.trim().length >= 8.

💡 Pista 3: Id del pedido

(1791385230000).toString(36) convierte el número a base 36; .toUpperCase().slice(-6) deja las últimas seis letras o cifras en mayúscula. Antepón LE-.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    pedido.js
    const MINIMO_DELIVERY = 25;
    const COSTO_DELIVERY = 3;
    const aCentimos = (soles) => Math.round(soles * 100);
    
    function faltaParaDelivery(subtotal) {
      const falta = aCentimos(MINIMO_DELIVERY) - aCentimos(subtotal);
      return falta > 0 ? falta / 100 : 0;
    }
    
    function direccionValida(texto) {
      return typeof texto === "string" && texto.trim().length >= 8;
    }
    
    function totalPedido(items, entrega) {
      let centimos = items.reduce((suma, l) => suma + aCentimos(l.precio) * l.cantidad, 0);
      if (entrega === "delivery") centimos += aCentimos(COSTO_DELIVERY);
      return centimos / 100;
    }
    
    function crearPedido(sesion, ahora) {
      const items = sesion.carrito.map((l) => ({ ...l }));
      return {
        id: "LE-" + ahora.toString(36).toUpperCase().slice(-6),
        telefono: sesion.telefono,
        items,
        total: totalPedido(items, sesion.entrega),
        entrega: sesion.entrega,
        direccion: sesion.direccion,
        pago: sesion.pago,
        estado: "recibido",
        creadoEn: ahora,
      };
    }