El negocio
Un conductor de aplicaciones de transporte rara vez califica para un crédito de vehículo. El autofinanciamiento por grupos resuelve eso sin banco: varias personas aportan una cuota mensual a un fondo común, y cada período ese fondo compra un vehículo para uno de ellos.
Quién lo recibe se decide de dos formas que conviven en la misma sesión: por sorteo, que es la vía gratuita, y por oferta, donde alguien adelanta cuotas para pasar antes. Ambas tienen que ocurrir sin que ningún participante tenga que creerle al operador.
Un sorteo entre personas que pusieron su dinero no basta con que sea aleatorio: tiene que ser demostrablemente aleatorio después del hecho. Y una oferta aceptada no puede prometer un vehículo que el fondo no puede pagar.
De ahí salen las dos piezas centrales: el congelamiento del fondo y el registro de auditoría del sorteo.
Planes, grupos y cuotas
Un plan define el vehículo, su valor y las condiciones. Un grupo es un conjunto de suscriptores sobre ese plan, con cupos limitados.
Que el grupo pase de formación a activo con la primera suscripción es deliberado: un grupo sin nadie no es un grupo, y modelarlo como activo desde su creación permitiría abrir asambleas de un grupo vacío.
El fondo y su congelamiento
El grupo tiene un fondo, y ese fondo no es un solo número. Son dos, y la diferencia entre ellos es lo que hace posible adjudicar sin sobrecomprometer.
Con un único número, dos adjudicaciones en la misma asamblea verían las dos el fondo completo y ambas pasarían la comprobación de suficiencia — aunque juntas lo excedan. El grupo quedaría debiendo un vehículo que no puede comprar, y el error se descubriría al ir a pagarlo.
Con el congelamiento, la segunda adjudicación ve el fondo ya descontado por la primera y se rechaza si no alcanza. Es la misma idea que separar saldo contable de saldo disponible en una cuenta bancaria.
Todas las operaciones de adjudicación se ejecutan dentro de una transacción. Congelar el fondo, crear la adjudicación y cambiar el estado de la suscripción son un solo hecho: no puede quedar un fondo congelado sin adjudicación que lo justifique, ni una adjudicación sin respaldo.
Adjudicación por sorteo
La vía gratuita. Entre los suscriptores elegibles que no han sido adjudicados todavía, se elige uno al azar.
El registro que hace verificable la corrida
Cada adjudicación por sorteo guarda un bloque de auditoría con todo lo necesario para reconstruirla:
| Dato | Para qué sirve al auditar |
|---|---|
| Número de elegibles | El tamaño del universo sobre el que se sorteó |
| Lista completa de elegibles | Quiénes estaban dentro — y por tanto quiénes no |
| Índice elegido | La posición que resultó ganadora |
| Bytes aleatorios | El valor crudo del que salió ese índice |
| Instante | Cuándo ocurrió |
Guardar la lista completa y no solo el conteo es lo que permite responder la pregunta que de verdad hace un suscriptor: «¿yo estaba en ese sorteo?». Con solo el número de participantes esa pregunta no tiene respuesta.
La primera versión generaba los bytes aleatorios, elegía al ganador con ellos y después, al construir el bloque de auditoría, generaba unos bytes nuevos y guardaba esos.
El registro parecía completo y no lo era: quien recalculara bytes mód elegibles obtenía un índice distinto del registrado, porque eran dos sorteos diferentes. Rompía exactamente la propiedad para la que el bloque existe. Ahora los bytes se capturan una sola vez y son los mismos que se auditan.
Queda anotada una imprecisión menor del método: el operador módulo introduce un sesgo hacia los primeros índices. Con cuatro mil millones de valores posibles y grupos de decenas de personas es despreciable, pero si el sorteo llega a tener valor legal, corresponde usar rechazo de muestras.
Adjudicación por oferta
La vía de pago: quien quiere adelantarse ofrece anticipar cuotas. Gana la oferta más alta, con dos condiciones que la hacen justa.
Quien ya salió favorecido en el sorteo de esa asamblea queda excluido de la oferta. Sin esa exclusión, alguien podría llevarse dos vehículos en una sola sesión mientras el resto del grupo sigue esperando — y el fondo, que es de todos, lo pagaría.
Al aceptar la mejor, todas las demás pasan explícitamente a rechazada. Dejarlas en pendiente las haría reaparecer como candidatas en la siguiente asamblea, comprometiendo a esas personas con un monto que ofrecieron para otra ocasión y que quizá ya no pueden sostener.
La comprobación de suficiencia usa el fondo disponible, no el actual. Por eso una adjudicación por sorteo hecha momentos antes en la misma asamblea reduce lo que la oferta puede comprometer — que es exactamente lo que debe pasar.
Cartera y comprobantes
El resto del módulo financiero sostiene la operación del día a día.
| Pieza | Qué resuelve |
|---|---|
| Comprobantes de pago | El suscriptor sube el soporte de su consignación; queda pendiente hasta que alguien lo revisa y lo aprueba o lo rechaza. El pago no cuenta antes de esa revisión |
| Alertas de mora | Cuotas vencidas sin pago aprobado, para que la cobranza no dependa de que alguien recuerde mirar |
| Salud del grupo | Estado agregado del grupo: recaudo, morosidad y capacidad de seguir adjudicando |
| Libro de fondos | Todo movimiento del fondo queda asentado con su tipo y su referencia al hecho que lo originó |
| Retiros | Un suscriptor que se va del grupo, con su liquidación |
| Estado de cuenta | Vista por suscripción de lo pagado, lo pendiente y lo vencido |
La separación entre subir el comprobante y aprobarlo es la misma idea que aparece en el resto del sistema: un documento cargado es una afirmación del suscriptor, y no se convierte en dinero recaudado hasta que alguien la verifica. Un sistema donde subir la foto ya salda la cuota no puede sostener un fondo que compra vehículos.
Arquitectura
Monorepo con dos aplicaciones sobre una base común.
| Capa | Tecnología |
|---|---|
| API | NestJS · TypeORM · PostgreSQL · Redis |
| Autenticación | Código de un solo uso para el conductor · tokens con renovación |
| Web | Next.js · React · Tailwind |
| Entorno | Contenedores para base de datos y caché |
El acceso del conductor es por código de un solo uso y no por contraseña: el público objetivo entra desde el teléfono y una contraseña más es una barrera de abandono, no de seguridad.