El problema
Quien encarga impresión tiene dos preguntas antes que ninguna otra: cuánto cuesta y cuándo lo tengo. En Denia Print quería responder a las dos mientras vas eligiendo opciones, en una web estática y sin esperas tras cada clic.
El precio es la mitad fácil. La fecha de entrega cuesta más. Depende de los días de producción de la combinación elegida, de la hora límite diaria del proveedor, de los festivos de dos países y de la hora que es.
El enfoque
Precio. La web es Astro estático sobre Cloudflare Pages. En la mayoría de los productos, la calculadora lee una tabla de precios incluida en la propia web. Esa tabla se reconstruye cada semana a partir de la API del proveedor y se despliega, así que elegir una cantidad o un papel no necesita ninguna petición. Las lonas tienen precio por medida y por eso piden un precio en vivo a un endpoint pequeño. El catálogo ampliado hace lo mismo, con la respuesta guardada 12 horas en la caché del edge por cada variante.
Fecha de entrega. La calculadora muestra una línea como “Pídelo antes de las 11:30 (quedan 2 h 14 min) y recíbelo mié, 7 oct – jue, 8 oct”. Se calcula en el navegador a partir de cuatro cosas:
- los días de producción de la combinación elegida, que ya vienen con los datos de precio
- la hora límite del proveedor: las 11:30, hora de Ámsterdam, de lunes a viernes
- un día laborable para mi propia gestión, porque reviso el archivo antes de que vaya al proveedor
- una lista de festivos: los de Países Bajos para la producción, los nacionales de España y los de la Comunitat Valenciana para la entrega en Dénia y la Marina Alta
La hora límite se calcula en la zona horaria de Ámsterdam, de modo que el navegador se encarga del cambio de hora, y se muestra en la zona horaria del visitante. La línea se vuelve a dibujar cada 30 segundos, cuando la pestaña vuelve a estar visible y cuando cambia la casilla de recogida del formulario. Si recoges en Dénia, dice “a partir del” con la fecha más tardía. A los lectores de pantalla solo se les anuncia la fecha cuando cambia, nunca la cuenta atrás.
Calibré la regla con la fecha mínima de entrega del propio proveedor para 40 combinaciones de producto y velocidad. El día del pedido más los días de producción coincidió 21 veces, salió más tarde 17 veces y antes 2 veces. Con mi día de gestión encima, el rango que muestro queda del lado tardío en 39 de 40 casos. Algunos productos van más lentos de lo que indican sus días de producción y reciben días laborables extra desde una tabla pequeña.
Comprobar el precio otra vez. El servidor no puede fiarse de un precio calculado en el navegador. El carrito vive en localStorage con un máximo de 20 líneas. Si el almacenamiento está bloqueado, la web sigue funcionando producto a producto. Antes de enviar el carrito, la página vuelve a pedir los precios a las mismas fuentes que las calculadoras. Un precio que ha cambiado o un producto que ya no está a la venta se marca y bloquea el envío. Nunca se ajusta en silencio.
Después el servidor lo hace otra vez para cada línea: los productos de tabla contra la tabla de precios, las lonas y los artículos del catálogo contra un presupuesto en vivo del proveedor. Una línea que no cuadra queda marcada, y el panel retiene el pedido al proveedor de esa línea hasta que alguien la revisa. En el catálogo ampliado, el navegador solo conoce las posiciones de las opciones. El código de artículo del proveedor se queda en el servidor.
Las concesiones
- La fecha es una estimación, y lo digo con un rango. Prefiero pecar de tarde: cada día contado tiene que ser laborable en los dos países. Un pedido que llega un día antes no es problema, al revés sí.
- La lista de festivos se mantiene a mano, una vez al año. Un test falla dos meses antes de que la lista se acabe. Un año que falte solo haría las fechas cercanas a sus festivos un día optimistas.
- La hora límite está fija en el código. Si el proveedor la mueve, la muevo yo.
- La cuenta atrás usa el reloj del visitante. Con el reloj del dispositivo mal puesto, la cuenta atrás sale mal.
- Los presupuestos en vivo tienen tope. Como máximo 10 líneas por pedido reciben un presupuesto en vivo del proveedor. El resto se marca para una revisión manual, para que un carrito no se convierta en 20 llamadas al proveedor.
Hay más sobre la tienda en la página del proyecto Denia Print.