CCamilo Griffa
←Trabajo

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ón

Ficha

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.