Valoriza — Documento técnico de plataforma

Gobierno societario auditable: aportes, votaciones y cierre

Cómo se registra lo que cada socio aportó, cómo se aprueba una salida de dinero antes de que ocurra, cómo se cuenta una votación cuando alguien tiene conflicto de interés, y por qué un mes cerrado deja de poder editarse.

Alcance · 17 módulos · 20 entidades Base · PostgreSQL · Prisma Pruebas · 81 · unitarias y de integración Marco · S.A.S. cerrada — Colombia
01

Qué resuelve

Una sociedad cerrada de pocos socios no falla por falta de contabilidad: falla por falta de acuerdo sobre los hechos. Quién aportó cuánto y cuándo, quién autorizó ese egreso, qué se decidió en la reunión de marzo y con qué mayoría.

Valoriza existe para que esas preguntas tengan una sola respuesta, y para que esa respuesta no cambie después. Casi todo el diseño se explica por ahí: los estados que obligan a pasar por una aprobación, los periodos que se cierran, el borrado que exige un motivo.

Aportes

Con evidencia y aprobación

Cada cuota tiene su comprobante, quién la aprobó y, si se rechazó, por qué.

Egresos

Autorizados antes de pagarse

Un movimiento recorre solicitud, aprobación y pago. No se puede pagar lo que nadie aprobó.

Decisiones

Mayorías según el tipo

Ordinaria, calificada o unánime, con el conflicto de interés descontado del censo.

Historia

Periodos que se cierran

Un mes cerrado deja de aceptar movimientos: los números del pasado dejan de moverse.

02

Aportes de los socios

El plan de aportes se genera completo desde el inicio: el aporte inicial y las cuotas mensuales, cada una con su fecha de vencimiento y su monto esperado. Existir antes de pagarse es lo que permite hablar de mora.

Estados de una cuota
PENDIENTE ─→ CARGADO ─→ EN_REVISIÓN ─→ APROBADO └─→ RECHAZADO MORA vencida sin pago aprobado ANTICIPADO pagada antes de su vencimiento ANULADO dada de baja, con motivo
La separación entre cargado y aprobado es el punto del diseño: el socio sube su comprobante, pero el aporte no cuenta como capital hasta que alguien lo revisa. Un sistema donde subir la foto ya suma dinero no sirve para respaldar una participación societaria.

Cada cuota guarda el monto esperado y el efectivamente pagado por separado, así que un pago parcial es representable sin mentir en ninguno de los dos. Y guarda quién aprobó, cuándo, y en caso de rechazo el motivo: rechazar sin explicar no es una opción del modelo.

03

Tesorería con aprobaciones

Un movimiento de tesorería no se registra: se tramita. Recorre una cadena de estados donde cada paso lo ejecuta alguien distinto.

Ciclo de un egreso
BORRADOR ─→ SOLICITADO ─→ PENDIENTE_APROBACIÓN ─→ APROBADO ─→ PAGADO └─→ RECHAZADO └─→ ANULADO
El estado PAGADO es distinto de APROBADO a propósito: autorizar un gasto y girarlo son dos hechos con fechas distintas, y confundirlos hace imposible saber cuánto está comprometido pero todavía no ha salido de la cuenta.
Por qué el borrador es un estado y no una ausencia

Un movimiento en borrador ya existe y ya es visible: se puede discutir antes de solicitarlo formalmente. Si el borrador viviera solo en el formulario de quien lo escribe, la conversación previa a la solicitud ocurriría fuera del sistema, que es justo donde después no hay rastro.

04

Capital y participación

La participación de cada socio no se escribe a mano: se calcula a partir del capital efectivamente pagado y el valor nominal de la acción.

Acciones y porcentaje
acciones del socio = capital pagado / valor nominal participación (%) = acciones del socio / acciones totales
Se calcula al vuelo sobre el total de la sociedad, así que aprobar un aporte cambia la participación de todos sin que nadie tenga que actualizar una tabla.
El socio ve exactamente el mismo número

La fila de capital que ve un socio en su propia pantalla usa la misma función que la tabla general de contabilidad. No es una consulta parecida escrita dos veces: es el mismo código.

En una sociedad, dos pantallas que muestran porcentajes distintos por un redondeo diferente no son un detalle estético — son una discusión entre socios.

05

Votaciones y conflicto de interés

Contar votos parece trivial hasta que aparecen dos cosas: tipos de mayoría distintos y socios que no pueden votar.

Quién puede votar

El censo de una votación son los socios activos que no tengan conflicto declarado en esa votación concreta. El conflicto no es un atributo del socio sino de la pareja socio–votación: alguien puede estar impedido en la decisión sobre un contrato y ser perfectamente elegible en la siguiente.

El conflicto reduce el denominador, no solo el numerador

Declarar un conflicto bloquea el voto de ese socio y lo saca del censo elegible. Si solo bloqueara el voto, su ausencia contaría como un voto que falta y una decisión unánime sería imposible de alcanzar. Sacándolo del censo, la unanimidad se mide entre quienes sí podían decidir.

Las tres mayorías

TipoCondición para aprobarEjemplo sobre 10 elegibles
OrdinariaMayoría simple de los votos emitidosmás votos a favor que en contra
Calificadafavor ≥ ⌈ 2/3 · elegibles ⌉7 aprueban · 6 no
Unánimefavor = elegibles, con elegibles > 0una abstención ya lo impide

Dos detalles que las pruebas fijan de forma explícita: la calificada se mide contra los elegibles y no contra los que votaron —abstenerse no baja el umbral—, y la unanimidad exige que haya al menos un elegible, para que una votación sin censo no se apruebe sola.

Cada voto es a favor, en contra o abstención, y queda atado a su socio. La votación puede colgar de una reunión o existir por sí sola, para decisiones que se toman fuera de sesión.

06

Reuniones y actas

Una reunión tiene convocatoria, asistencia registrada y acta. Las tres cosas separadas, porque responden a preguntas distintas y se producen en momentos distintos.

La asistencia es su propia entidad: quién estaba es un hecho verificable que condiciona la validez de lo decidido, y no puede quedar como una frase dentro del acta. Las votaciones asociadas a la reunión se enlazan a ella, de modo que el acta y el resultado de la votación no pueden contarse distinto.

07

Cierre de periodo

Un mes se cierra, y a partir de ahí deja de aceptar movimientos con fecha dentro de él.

La comprobación
periodo(fecha) = (año, mes) cerrado(fecha) = periodo(fecha) ∈ periodos cerrados
Se evalúa contra la fecha del movimiento, no contra la fecha de registro. Intentar meter hoy un gasto con fecha de un mes ya cerrado es exactamente lo que el cierre debe impedir.
Por qué esto importa más de lo que parece

Sin cierre, un reporte del primer trimestre puede dar un número distinto cada vez que se abre, porque alguien siguió registrando cosas hacia atrás. En una sociedad donde ese reporte respalda un reparto o una decisión, que el pasado se mueva es un problema de gobierno, no de contabilidad.

El cierre guarda quién lo hizo y cuándo, y es una entidad propia con año y mes, no una bandera dentro de otra tabla.

08

Trazabilidad

Tres mecanismos, cada uno cubriendo un hueco distinto.

MecanismoQué garantiza
Registro de auditoríaQué cambió, quién lo cambió y cuándo
Borrado lógico con motivoNada se elimina de verdad. Se guarda quién lo dio de baja y por qué
Documentos con estadoLos soportes viven en el sistema, no en el correo de alguien

Que el borrado exija un motivo es una decisión de diseño, no un campo opcional que alguien olvidó marcar como obligatorio. En una sociedad, «este aporte ya no aparece» sin explicación es peor que el error que se intentaba corregir.

El sistema incluye además tareas y notificaciones, para que un aporte en mora o un movimiento esperando aprobación no dependan de que alguien se acuerde de mirar.

09

Tránsito a S.A.S.

Formalizar una sociedad en Colombia es una secuencia de trámites que se hacen una sola vez, en orden, y donde olvidar uno bloquea los siguientes.

El sistema lleva esa lista como una entidad única con once hitos: disponibilidad del nombre, estatutos, documento de constitución, registro en cámara de comercio, RUT, cuenta bancaria, acuerdo de accionistas, libro de accionistas, actas iniciales, contador y facturación electrónica. Cada uno se marca al cumplirse, y de ahí sale un porcentaje de avance.

Un registro único, no una tabla de filas

Es un solo registro con identificador fijo, porque la lista de trámites de constitución no se repite: una sociedad se constituye una vez. Modelarla como una colección invitaría a que existieran dos, y entonces habría que decidir cuál es la buena.

10

Arquitectura y verificación

La aplicación está organizada por módulos de dominio, no por capas técnicas. Cada módulo agrupa su lógica, sus consultas y sus acciones.

Estructura de un módulo
modules/votaciones/ tally.ts cómo se cuentan los votos · puro eligibility.ts quién puede votar · puro service.ts orquestación contra la base de datos queries.ts lecturas para las pantallas actions.ts entradas desde la interfaz schema.ts validación de lo que llega
Las reglas que deciden —cómo se cuenta una mayoría, quién es elegible, si un periodo está cerrado— viven en archivos puros, sin base de datos. Es lo que permite probarlas exhaustivamente sin levantar nada.

Dos niveles de prueba

81 pruebas, divididas en dos clases con propósito distinto:

NivelQué verifica
UnitariasLas reglas puras: umbrales de mayoría, censo elegible, tabla de capital, periodo cerrado
IntegraciónEl comportamiento contra una base de datos real: que un conflicto declarado bloquee el voto, que el cierre rechace el movimiento

La puerta de calidad levanta una base de datos, aplica las migraciones y corre ambos niveles junto con el lint y el chequeo de tipos antes de permitir un despliegue.