Saltar al contenido
georgepuma.dev

proyectoscleo-spa

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

Tabla de movimientos de inventario: cada fila lleva tipo, producto y variante, cantidad con signo, ubicación, fecha y autor.
Movimientos: cada fila es un asiento del ledger. Entrada, consumo, venta o merma, siempre con cantidad firmada y autor.
Pantalla de usuarios: formulario de invitación con selector de rol y tres cuentas del equipo, cada una con su rol y un botón para desactivarla.
Usuarios: los tres roles operativos. Se invita por correo y se desactiva — no se borra.
Tabla del catálogo: nombre del producto, marca y línea, número de variantes y estado.
Catálogo: marca, línea y variantes — la base sobre la que se mueve el stock.

Tres decisiones que sostienen el resto

  1. 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.

  2. 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.

  3. 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.

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.