Ejercicio: Flujo de pedido
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:
faltaParaDelivery(subtotal): el mínimo de delivery es S/ 25. Devuelve cuántos soles faltan (0 si ya lo alcanzó), calculado en céntimos para no arrastrar decimales: con 21.3 da3.7.direccionValida(texto): es válida si, tras quitar espacios de los extremos, tiene 8 caracteres o más. Si no recibe un texto, es inválida.totalPedido(items, entrega): sumaprecio * cantidadde las líneas en céntimos y, sientregaes"delivery", añade S/ 3. Devuelve soles. Con"recojo"no añade nada.crearPedido(sesion, ahora): devuelve{ id, telefono, items, total, entrega, direccion, pago, estado, creadoEn }. ElidesLE-másahora.toString(36).toUpperCase().slice(-6);itemses una copia desesion.carrito;totalsale detotalPedido;estadoes"recibido";creadoEnesahora.sesiontienetelefono,carrito,entrega,direccionypago.
💡 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.
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.
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,
};
}