Freelance · full-stack · 2026
Yana
Un sistema de gestión de stock, compras y ventas para una tienda de plantas y decoración. En producción, con el catálogo real de la clienta.
Ver en producciónFicha
- Rol
- Freelance · full-stack
- Año
- 2026
Stack
- Next.js
- TypeScript
- Drizzle
- Supabase
- Tailwind
En producción
con datos reales de la clienta
29
tests de integración del dominio
2
bases separadas, desarrollo y producción
Las decisiones se tomaron con la clienta, no por ella
Antes de escribir el modelo de datos hubo una ronda de preguntas abiertas, y cada respuesta quedó documentada junto con qué se implementó a partir de ella. Dos de esas respuestas sacaron tablas del modelo en lugar de agregarlas:
- Los productos no tienen SKU ni unidad de medida: para la tienda, una presentación distinta es un producto distinto.
- El proveedor es un campo de texto libre en la compra, no una ficha propia con su ABM.
Las dos son menos sistema del que se podría construir, y exactamente el sistema que la tienda necesita.
El stock tiene una sola fuente de verdad
Los movimientos de stock son lo único que define cuánto hay. La lógica de costo y de descuento vive en la capa de dominio, fuera de la aplicación, y la reutilizan tanto las acciones de servidor como los datos de prueba: no hay dos implementaciones que puedan divergir.
El costo del producto es el de la última compra, no un promedio ponderado: cada compra lo pisa y se puede corregir a mano. El recargo se calcula desde costo y precio en lugar de guardarse, así que nunca queda desactualizado.
El cierre de caja se contrasta contra la plata real
Cada venta registra su medio de pago, y la pantalla de cobros compara lo que dicen las ventas del día contra lo que se contó de verdad, con la diferencia a la vista.
La integración con Mercado Pago trae los cobros reales del día para ese contraste, y es opcional: si no está conectada, la pantalla funciona igual y lo avisa. Banco Galicia quedó afuera a propósito. Su API existe, pero exige cliente Empresas, Office Banking, certificados mTLS y un onboarding comercial del banco; para una tienda, cargar ese saldo a mano cuesta menos que mantener esa integración.
Los detalles aparecieron con datos reales
El desplegable para elegir producto al cargar una venta funcionaba perfecto con datos de prueba y se volvió inusable apenas entró el catálogo de verdad, entre macetas, sahumerios y decoración. El buscador que lo reemplazó ignora acentos —los nombres vienen de los proveedores con ellos y nadie los escribe al buscar— y acepta palabras sueltas en cualquier orden.
El acceso pide un segundo factor siempre, no como opción, y bloquea la cuenta tras cinco intentos fallidos. Y hay dos bases de datos separadas, una de desarrollo y una de producción, para que probar en local no pueda tocar los datos de la clienta.
Sin capturas de pantalla: los datos que muestra el sistema son de la clienta.