Producto propio, en producción

El precio que paga la hora del dueño, calculado sin cuenta

Lucrei es la brújula financiera que construimos para autónomos y pequeños negocios: cuánto entra, cuánto queda de verdad, cuánto cuesta hacer cada producto y cuánto paga el precio actual por la hora de quien produce. El argumento más difícil de sostener no fue ninguno de esos números: fue mostrarlos a quien todavía no tiene cuenta.

  • 1.642 en 130 archivos
    Pruebas automáticas
  • 56, todas aditivas
    Migraciones de base de datos
  • 8 campos en pantalla, 4 bajo avanzado
    Calculadora pública
  • 10%, 20%, 30% y 40% de margen
    Metas de precios
  • 7 factores en 5 pilares, nota de 0 a 100
    Marcador de salud
  • plazo de 3 a 36 meses
    Plan de crecimiento
  • R$ 81.000
    Techo anual del MEI vigilado

Facturar no es lucrar, y el cuaderno no sabe la diferencia

La repostera que pasa la madrugada con encargos y el artesano de la impresión 3D con la cola llena llegan a fin de mes con el mismo problema: saben exactamente cuánto vendieron y no tienen idea de cuánto quedó. El precio nació mirando el de la competencia, el dinero de casa vive en la misma cuenta que el de la empresa, y la respuesta a "¿valió la pena?" es una sensación, no un número.

La restricción que heredamos de ese escenario es de entrada de datos, no de cálculo. Preguntar "¿cuánto coste fijo cabe en cada unidad?" a quien nunca hizo un reparto devuelve una suposición que contamina todo lo que viene después, y un sistema alimentado por suposiciones produce un informe bonito con una decisión equivocada dentro. Por eso el principio de interfaz del producto es una prohibición y no una buena intención: nunca pedir al emprendedor una información que probablemente no sabe responder.

Lo que Lucrei pide son los costes fijos del mes y las unidades vendidas en el mes, dos cosas que cualquier dueño responde de memoria, y deriva el reparto dividiendo uno por el otro. Lo mismo vale para la merma de producción, que llega rellenada con la media del tipo de fabricación (8% para filamento 3D, 15% para resina, 3% para corte láser) y sigue siendo editable para quien conoce su propio banco de trabajo mejor que la media del mercado.

Un diagnóstico que pide correo antes del número no es diagnóstico

La restricción vino antes que la solución: pedir facturación a quien todavía no confía en el producto es pedir demasiado pronto, y una calculadora que solo revela el resultado después del registro es captación de contactos disfrazada de herramienta. Decidimos lo contrario: el visitante ve su propio número primero y decide después si quiere una cuenta.

La calculadora que abre la home de Lucrei es un componente de cliente sin ninguna llamada de red: ningún fetch, ningún estado en el servidor, nada guardado. Son 8 campos en pantalla, material por unidad, tiempo de producción, cuánto vale tu hora, merma, costes fijos del mes, unidades del mes, precio que cobras hoy y comisión del canal de venta: más 4 bajo "avanzado", para energía y depreciación de equipos, que solo entran en la cuenta si se rellenan.

Las metas de negocio son cuatro botones en vez de un campo de porcentaje: Supervivencia con 10%, Crecimiento con 20%, Expansión con 30% y Premium con 40% de margen neto, porque quien vende artesanía entiende un objetivo mejor que una abstracción. El resultado sale con el coste por unidad, el beneficio por hora trabajada y un veredicto de cuatro estados: por debajo del equilibrio, por debajo de la meta, en el objetivo o por encima del sugerido.

Un detalle que solo aparece cuando se prueba con gente de verdad: los campos no usan el tipo numérico de HTML. El navegador trata "39,90" como valor inválido y devuelve una cadena vacía, así que el campo se borra solo mientras la persona escribe. Lo cambiamos por un campo de texto con teclado decimal y el mismo intérprete de números en portugués que usa el importador de hojas de cálculo del producto, que ya entiende tanto "1.234,56" como "1234.56".

Dos pantallas nunca se contradicen porque solo existe una cuenta

La restricción aquí es de confianza: en un producto que afirma cuánto ganaste, basta con que el panel y la pantalla de precio difieran una sola vez para que todo el número quede bajo sospecha. Es un fallo barato de introducir: alguien reimplementa una fórmula en una pantalla nueva porque fue más rápido que importar la existente, y caro de descubrir, porque quien lo descubre es el usuario.

Todo indicador de negocio nace de un único hub de métricas, y la lógica de cálculo vive en módulos puros, sin base de datos y sin entrada ni salida, con el archivo de pruebas al lado de cada uno. El acceso a datos queda en una envoltura fina por encima. Una regla de arquitectura corre en el CI y rechaza la entrega cuando alguien rehace la cuenta por fuera, lo que convierte la fuente única de verdad en un mecanismo y no en un acuerdo verbal.

Esa disciplina es lo que permite que la calculadora pública sea honesta: importa exactamente las funciones que corren dentro del producto, coste unitario efectivo, coste de mano de obra, energía, depreciación por unidad, margen por meta y beneficio por hora. Si la fórmula cambia dentro, la página cambia con ella, porque no existe una segunda copia que alguien pueda olvidar actualizar. Hoy son 1.642 pruebas automáticas en 130 archivos custodiando ese contrato.

Cada empresa aislada por construcción, no por atención

El multi-tenant por fila es la arquitectura más barata de operar y la más fácil de perforar: basta una consulta que confíe en el identificador que vino de la pantalla. La restricción que asumimos fue sacar esa decisión de las manos de quien escribe la consulta, porque la atención humana no escala a todas las pantallas de un producto que solo crece.

Toda consulta a la base de datos está acotada por el identificador de la empresa derivado de la sesión validada criptográficamente, nunca por lo que el usuario escribió ni por lo que vino en la URL. Cuando la suscripción vence, el sistema pasa a solo lectura: no se borra nada y no se escribe nada, pero todo sigue consultable, que un cliente se vaya nunca puede parecerse a una pérdida de datos.

La política de seguridad de contenido se emite en cada petición con su propio nonce y no como cabecera estática: en producción el navegador solo ejecuta el script que esa carga concreta firmó. Y el rastro de intentos de acceso vive en una tabla separada de la auditoría administrativa, con el correo guardado solo como hash: una ráfaga de intentos no ahoga el rastro que el operador necesita leer, y una filtración del registro no entrega la dirección de nadie.

Migración aditiva, porque la alternativa rompe el acceso

La trampa número uno de este producto tiene nombre: la columna que falta. La base de datos es SQLite alojado en Turso, accedido por Prisma a través del adaptador libsql, y Prisma nunca hace una selección genérica: enumera las columnas del esquema en cada consulta. Si el código sube antes que la migración, la primera consulta del flujo de autenticación pide una columna que todavía no existe y el acceso entero se cae, para todos, de una vez.

La regla que adoptamos es que toda migración sea aditiva y segura para el acceso: añadir columna anulable, crear tabla, nunca eliminar, renombrar ni imponer obligatoriedad sin valor por defecto. Son 56 migraciones en el repositorio bajo esa disciplina, y una prueba en el CI rechaza la entrega cuando una migración nueva contiene una eliminación, un renombrado, una alteración de columna o un campo obligatorio sin valor por defecto.

El aplicador de producción registra cada migración ya ejecutada en una tabla de control con checksum, así que ejecutarlo dos veces no hace nada: la idempotencia es una propiedad del runner, no la suerte del operador. Y un renombrado de identificadores de plan, que sería una puerta de un solo sentido, quedó deliberadamente fuera de la carpeta de migraciones: aplicarlo convertiría cualquier reversión del código en una degradación silenciosa de plan, y el coste de retenerlo es cero porque un alias en el código ya entrega el vocabulario nuevo en pantalla.

Una base, varias marcas, y un marcador en vez de un informe

Lucrei es whitelabel de nacimiento: colores, logo y nombre cambian por configuración, y la misma base se convierte en el producto de otro operador con su propia cara. Eso obliga al sistema a servir a dos clientes a la vez: el emprendedor que registra la venta del día y el operador que revende la plataforma y necesita un panel de dueño, con ingreso recurrente, embudo de clientes y rastro de auditoría de todo lo que ocurre.

Para el emprendedor, la pantalla de apertura resume en vez de volcar: 7 factores de salud del negocio se condensan en 5 pilares clicables (Finanzas, Ventas, Inventario, Producción y Crecimiento) que se convierten en una nota de 0 a 100 y una frase que nombra el pilar más débil. Los micro-gráficos son SVG escrito a mano en lugar de una librería de gráficos, decisión que mantiene esa página en torno a 158 kB frente a los cerca de 269 kB de las pantallas que cargan Recharts.

El plan de crecimiento toma el capital ya invertido y devuelve la meta del día, con un control de plazo que se desliza de 3 a 36 meses y recalcula en el navegador mientras la persona arrastra. Y el centro fiscal vigila el techo anual del MEI, el régimen brasileño de autónomo, hoy R$ 81.000, con semáforo de obligaciones y calendario de fechas, porque pasarse del techo sin darse cuenta no es un susto contable, es la pérdida del propio régimen.

Lucrei está en el aire, con sitio público indexable y la calculadora abierta a quien quiera comprobar la cuenta antes de crear una cuenta. El argumento no es una promesa nuestra sobre el producto: es el mismo coste por unidad que corre dentro de él, ejecutándose en el navegador de quien está leyendo.