
Vikoma
Sistema para negocios de Ecuador que trabajan con citas, como salones de belleza, peluquerías, estudios de uñas, spas y barberías. Reemplaza el cuaderno, los chats y el cuadre de caja a mano. Ya está en uso: la primera barbería de prueba se registró y configuró su negocio.
Cada negocio tiene su propio espacio, con su equipo, servicios y clientes. El dueño entra con su cuenta de Google y deja todo listo en unos 5 minutos, según lo medido con la barbería de prueba. Incluye agenda sin cruces, inventario que baja solo con cada venta, caja y reportes de ingresos, confirmaciones por WhatsApp, lista de espera, fotos de referencia con permiso del cliente según la ley de protección de datos de Ecuador y permisos distintos para el dueño y el equipo. La agenda se puede ver aunque se caiga el internet. Lo hice solo: el dinero se guarda en centavos para evitar errores de redondeo, las horas en UTC, y tiene 2.679 pruebas automáticas que corren en unos 16 segundos y cubren cerca del 81 % del código de las reglas de negocio y del acceso a datos.
Problemas
- Los datos de un negocio podían quedar enlazados con los de otro, porque la base de datos tursodb no revisaba las relaciones entre tablas y no avisaba.
Cómo los resolví
- Lo comprobé con una prueba que debía fallar y pasé producción a libSQL. Todos los datos pasan por un solo punto de acceso, con pruebas que confirman que nunca se mezclan. La app no arranca si la base de datos no revisa esas relaciones.
Ver 4 problemas y soluciones másOcultar los problemas y soluciones extra
Problemas
- Dos clientes no podían reservar la misma hora, aunque lo intentaran en el mismo instante.
- Dos cobros al mismo tiempo podían vender productos sin stock o repetir un número de factura.
- El inicio de sesión (OAuth) daba por bueno cualquier valor. Una función leía el texto en el formato equivocado (hexadecimal en vez de base64url), obtenía datos vacíos y todo coincidía.
- Una falla de WhatsApp no debía impedir que se guardara la cita.
Cómo los resolví
- Cada reserva vuelve a revisar el horario en el momento de guardarse, no solo en la pantalla.
- El número de factura se asigna en un solo paso dentro de la base de datos. Una prueba con 25 cobros al mismo tiempo exige 25 números distintos. El stock solo se descuenta si alcanza, y si la base de datos está ocupada, se vuelve a intentar.
- Lo detectó una prueba de seguridad que intentaba entrar con datos falsos. Ahora se compara un hash de ambos valores, y la comparación siempre tarda lo mismo para no dar pistas.
- El mensaje se guarda en una cola junto con la cita y se envía después, con reintentos. Si el cliente no dio su permiso, no se envía.



