Mini-caso · Cliente directo · en producción
Cleo Spa
Inventario, catálogo público y reservas para un salón de belleza en Arequipa. La herramienta que el personal usa a diario — no una vitrina.
- problema
- Un salón necesita saber qué stock tiene, quién lo movió y qué se puede reservar, sin que eso dependa de la memoria de nadie.
- rol
- Cliente directo: base de datos, panel de operación y catálogo público. En producción.
- alcance
- Ledger de stock inmutable con lotes FEFO · RLS default-deny en 16 tablas · tres roles operativos (dueña, cajera, estilista).
- resultado
ledger insert-only
correcciones = ajustes
3 roles
permisos en BD y app
Next.js 16 · React 19 · TypeScript · Tailwind v4 · Supabase · Zod · Vitest
El producto, sin maquillaje



Tres decisiones que sostienen el resto
El stock no se edita, se registra
Cada movimiento entra como fila nueva con cantidad firmada, ubicación, fecha y autor. Una corrección no reescribe el pasado: entra como un ajuste más. El saldo de cualquier producto es la suma de su ledger, así que la pregunta «quién movió esto y cuándo» siempre tiene respuesta.
Lotes FEFO, y el aviso antes del vencimiento
El stock se lleva por lotes y las salidas consumen primero el que vence antes. El panel abre con dos alertas —bajo mínimo y lotes por vencer— porque un vencimiento se descubre tarde o no se descubre.
Tres roles, la misma frontera en dos capas
Dueña, cajera y estilista. Los permisos viven en la base de datos con RLS default-deny sobre 16 tablas, y la aplicación repite esa frontera: la interfaz no ofrece lo que la base va a rechazar. Que la regla esté abajo es lo que hace que valga aunque el panel se equivoque.
Lo que dejó
De aquí salió el starter kit con el que Ronatello llegó a producción en 12 días: el mismo esqueleto de roles, RLS y CI, ya discutido una vez.
Pendiente
Las migraciones están versionadas y son idempotentes, pero todavía se aplican con una herramienta externa al repositorio: un entorno limpio no se levanta desde cero. Es lo primero que cerraría antes de que el proyecto cambie de manos.