El ticket ocupaba una línea: «calcular el vencimiento según las condiciones de pago del cliente». Pago a 60 días, fin de mes, y si cae en no laborable se pasa al siguiente día hábil. Diez minutos, dijo. Nunca son diez minutos.
El proyecto es el módulo de facturación de un cliente con un NDA de los que no se leen por encima: el código no sale del portátil ni para pedir ayuda. Así que la utilidad se escribió en el IDE del navegador, con el modelo corriendo ahí mismo, sobre la GPU de quien programa. Sin servidor al que subir nada.
Dónde se rompe de verdad
Sumar meses parece trivial hasta que le metes un 31 de enero. La respuesta correcta es el 28 (o el 29) de febrero, porque el 31 no existe. Y ahí sale el detalle que se lleva por delante media implementación: sumar meses no es asociativo. Sumar uno y luego otro a un 31 de enero te deja en el 28 de marzo; sumar dos de golpe te deja en el 31. Si tu función acumula en un bucle, acabas de fabricar un bug que solo aparece en las facturas de enero y que nadie va a saber reproducir en junio.
La lista de sorpresas fue más larga:
- Los literales de fecha tipo 2026-01-31 se interpretan en UTC. Al formatearlos en hora local pueden devolverte el día anterior, que en un vencimiento es la diferencia entre estar al día y estar en mora.
- Fin de mes significa cosas distintas: último día natural o último día hábil, y depende del contrato, no de la librería.
- Los festivos no vienen de ninguna API. Son una tabla que te pasa administración, con los locales de cada centro.
Para qué sirve tener el modelo dentro del editor
Lo útil no fue que escribiera la función; eso lo hace cualquiera. Lo útil fue pegarle la redacción literal de las tres cláusulas y pedirle la tabla de casos: fechas de emisión en los sitios feos —31 de enero, 30 de noviembre, un 29 de febrero, el puente de diciembre— con el resultado esperado de cada una y la cláusula delante, para que no se inventara la interpretación.
De cuarenta casos, once fallaron a la primera. Nueve eran bugs. Dos eran que la cláusula estaba mal redactada, y eso acabó en un correo al cliente, que es donde acaba el trabajo bueno.
Y por qué no salió de ahí
Porque en ese prompt había las condiciones comerciales del cliente palabra por palabra, el calendario laboral con los centros que tiene abiertos y trozos de un módulo que no es tuyo. Nada de eso es un secreto de Estado, pero tampoco es material que pegues en el formulario de otra empresa y luego tengas que explicar en una revisión.
La pregunta no es si el proveedor lo guarda. Es que ya no depende de ti.
Hubo además un efecto lateral que no estaba en el plan: el tramo de tren sin cobertura. El editor seguía contestando, porque el modelo estaba en la pestaña y no al otro lado de un cable.
Abre Elffuss Code en una pestaña y escribe tu propia utilidad de fechas: el modelo corre dentro del navegador, así que ni tu código ni tus prompts suben a ningún sitio.
Abrir Code →