Lazos que Organizan el Futuro
Gestión integral para cooperadoras escolares de la Provincia de Buenos Aires.
Demo · Repositorio · Documentación · Grist
LOF es una SPA construida con Svelte 5 que funciona como Custom Widget dentro de un documento Grist. No tiene backend propio: lee y escribe directamente en las tablas del documento. Pensada para funcionar 100% offline, sin CDNs, APIs externas ni telemetría.
Construida con software libre bajo AGPL-3.0. Pensada desde el territorio, para compañeras y compañeros sin conocimientos técnicos.
Configuración inicial
- Wizard guiado paso a paso: módulos, escuela, banco, cargos del estatuto y ejercicio.
- Validaciones argentinas en tiempo real: CUE (contra índice oficial de PBA), CUIT/CUIL (checksum oficial), CBU (checksum), DNI, teléfono (formato argentino +54 9), email.
- Color de marca como tema primario de la app (conversión a OKLCH para light/dark mode).
- Bloqueo de datos validados: una vez validados, los datos institucionales y bancarios no se pueden editar sin re-validar.
- Módulo Kiosco/Librería opcional (propio o licitado, con fechas de contrato).
Dashboard de inicio
- Situación actual: foto instantánea del estado operativo — saldos por cuenta (Banco, Efectivo, Caja Chica) en tarjetas individuales con saldo total, última carga de movimientos, período actual, ejercicio en curso y alerta cuando no hay ejercicio activo con CTA a gestionar ejercicios.
- Resumen ejecutivo: ejercicio en curso con alerta de vencimiento, cargos obligatorios cubiertos (quórum), socios activos, altas/bajas del último año, vencimientos próximos (60 días), alerta de asamblea AGO (recordatorio en mayo).
- Tablero de caja: saldos por cuenta (Banco, Efectivo, Caja Chica) y saldo total.
- Administración: cambio de modalidad de gestión, generación automática de períodos, revalidar schema, reparar refs rotas, deduplicar personas por DNI, detección de versión desactualizada.
- Creación de nuevo ejercicio automática al cerrar el ejercicio activo (arrastra saldos finales como saldos iniciales del nuevo).
Comunidad
- Padrón unificado — un solo listado de personas y socios con filtros por vínculo (socios/no socios), estado (Activos/Bajas/Todos), tipo de socio (Activo/Honorario/Adherente), tipo de persona (Física/Jurídica) y categoría (Socio/Docente/Directivo/Proveedor/Donante). Badges visuales por persona: Socio Activo/Baja, No socio, Física/Jurídica.
- Toggle "Es socio" — desde el mismo formulario de persona, un switch activa los campos de socio (tipo, fecha de alta, baja con motivo). No hace falta ir a otro módulo para dar de alta un socio.
- Personas físicas y jurídicas — campos específicos según el tipo: apellido + nombre + DNI + CUIL para físicas; razón social + CUIT para jurídicas.
- CUIL obligatorio con prefijo pendiente — cuando solo se carga el DNI, se genera un CUIL con prefijo
00(pendiente) que no se usa para deduplicación. El usuario puede completar el CUIL real después. - Búsqueda instantánea por apellido, DNI, CUIL, email, teléfono, localidad o domicilio. Vinculación automática al escribir DNI: busca persona existente y la vincula.
- Bajas y reactivaciones con motivo (Renuncia, Falta de pago, Fallecimiento, CambioEscuela, Otro). Validación de mayoría de edad y habilitación electoral automática (activo + 30 días de antigüedad).
- Combobox de localidades de toda la Provincia de Buenos Aires.
- Panel de movimientos de la persona seleccionada (modo gestión integral): muestra los últimos 5 movimientos asociados.
- Protección multiplayer: evita duplicados cuando dos usuarios crean la misma persona simultáneamente.
- Normalización automática: DNI/CUIL se guardan como dígitos crudos, teléfono con prefijo internacional, email en lowercase.
Tesorería
- Movimientos — entradas, salidas y traspasos con rubro/subrubro según PIA, destino bancario (Cuenta corriente / Plazo fijo), socio o persona asociada, y combobox con búsqueda para listas grandes. Filtrado de rubros por tipo, subrubros dinámicos por rubro. Filtros por rubro, ejercicio, período y persona (ejercicio en curso seleccionado por defecto). Selector de ejercicio con label "en curso".
- Cuota societaria rápida — atajo Ctrl+1 o botón para pre-cargar movimiento de cuota social en un click.
- Gestión por etapas (carga consolidada) — matriz de carga por rubro con múltiples filas por cuenta (hasta 3), importe en formato pesos argentinos ($ 1.234,56). Layout de dos columnas (lista de períodos + matriz editable) igual que Comunidad. Múltiples cargas por período: cada carga es una carga parcial que se consolida al firmar el período. Selector de carga dentro del período. Firma y cierre a nivel período (bloquea todas las cargas). Reapertura devuelve todas las cargas a borrador. Períodos firmados son read-only.
- Periodicidad configurable — elegí con qué frecuencia gestionás la tesorería: mensual, semanal, trimestral, semestral o anual. Se configura en Inicio → Configuración y se aplica a resúmenes, gráficos, tablas y cargas. Las cargas mensuales existentes se agrupan automáticamente en bloques (trimestral/semestral/anual) sin migrar datos. Etiquetas de períodos con rangos de fechas claros (ej: "2027-W17 (07/06 al 14/06)" para semanas, "Ene - Mar 2026" para trimestres).
- Resumen analítico con tabs — 5 vistas de análisis con gráficos (LayerChart):
- Flujo de caja: entradas vs salidas por período con saldo acumulado.
- Gastos e ingresos: distribución por rubro, top gastos, comparación entradas/salidas.
- Comparativa interanual: compara el ejercicio actual con cualquier ejercicio anterior (selector flexible para 3+ ejercicios, no limitado a los últimos dos).
- Morosidad: en gestión integral, identifica socios deudores por nombre; en carga consolidada, estima morosidad global. Detecta automáticamente si los movimientos están vinculados a socios o son cargas consolidadas, y si hay una mezcla (cambio de modo a mitad del ejercicio), calcula los deudores solo sobre el tramo con datos identificables.
- Salud operativa: indicadores de carga por período, períodos firmados vs abiertos, tendencia de gastos.
- Regla "detalle gana": si hay movimientos en un período, usa totales de movimientos; si no, usa cierres manuales. Permite mix de carga detallada y consolidada.
- Cierres mensuales con firma de período y bloqueo de edición. Agrupación automática de cierres mensuales en bloques según la periodicidad configurada.
- Validación de no-futuro — no se pueden crear cargas para períodos futuros. El sistema bloquea cualquier intento de cargar datos adelantados.
Cierre y presentación
- PIA en PDF — generación automática de la Planilla de Ingresos y Aportes desde los movimientos cargados por rubro durante el ejercicio. Mapeo a los campos AcroForm del formulario oficial de PBA, con encabezado, síntesis del acta, nómina de autoridades, cuadro de recursos y gastos, datos bancarios y kiosco.
- Nómina de autoridades en PDF — Comisión Directiva (14 cargos), Comisión Revisora de Cuentas y representantes ante la Federación.
- Cierre automático con próximo ejercicio — al cerrar el ejercicio activo, el sistema calcula los saldos finales por cuenta, crea el próximo ejercicio automáticamente con esos saldos como saldos iniciales y lo marca como en curso. El botón alterna entre Cerrar y Reabrir sin recargar la página.
- PIA de ejercicios históricos — muestra todas las autoridades designadas en el ejercicio seleccionado (no solo las vigentes), permitiendo generar la documentación de ejercicios anteriores correctamente.
- Alertas accionables — validación de datos faltantes (asesor, CD, CRC, AGO, movimientos, socios, datos bancarios) con links directos al módulo correspondiente para completarlos antes de generar el documento.
- Previsualización antes de descargar, con totales de entradas y salidas del ejercicio.
Institucional
- Datos generales — escuela, cooperadora, banco y kiosco/librería en un solo lugar, con validación de CUIT, CBU y autocompletado de CUE desde el padrón oficial de PBA.
- Cargos del estatuto — definición de cargos por organismo (CD, CRC, Federación) con orden, duración, grupo de renovación (A/B para CD, art. 15) y nivel (Titular/Suplente). Sección plegable con nota de que los cambios estructurales requieren asamblea.
- Autoridades vigentes — tabla de quién ocupa cada cargo hoy, con fecha de asunción, vencimiento, origen (Asamblea/RCD) y acciones de Cese y Reemplazo sin salir de la página.
- Histórico de autoridades — diálogo con selector de ejercicio y filas expandibles por cargo que muestran la cadena completa de reemplazos a través de todos los ejercicios.
- Alerta de quórum — contador de titulares vigentes y alerta si baja del mínimo. Detección de persona en otro cargo del mismo organismo.
- Asesor institucional — delegación del director, registro de ceses y histórico.
- Ejercicios fiscales — creación, activación y edición de ejercicios con saldos iniciales.
Gobierno
- Asambleas (AGO/AGE/RCD) con resoluciones vinculadas al ejercicio.
- Carga de autoridades desde el wizard de asambleas — wizard inline con selección de cargos por organismo (CD, CRC, Federación). Toggle global y por organismo para elegir qué cargos cargar (carga total o parcial). Creación de persona y socio desde el flujo, con validación de CUIL/DNI y PersonaPicker unificado.
- Histórico de mandatos — tabla de todos los mandatos por ejercicio (vigentes y cesados), con filtro por organismo. Memoria institucional de quién ocupó cada cargo y desde qué acta.
- Padrón electoral automático según estatuto modelo.
Los ceses, reemplazos y la gestión cotidiana de autoridades vigentes se gestionan desde el módulo Institucional.
Experiencia de usuario
- Paleta de comandos (Ctrl+K) tipo VS Code con acciones del módulo actual, navegación y acciones rápidas.
- Atajos de teclado completos: Ctrl+N (nuevo), Ctrl+F (buscar), Ctrl+1 (cuota social), Ctrl+I/C/M/R/A (navegación),
/(enfocar búsqueda),?(ayuda). - Sidebar dinámico colapsable: el menú se genera según módulos activos, con atajos de teclado por item.
- Combobox con búsqueda y modo "large" para listas grandes (> 50 items, requiere 3 caracteres).
- Tema dinámico: la app toma el color de marca de cada cooperadora como tema primario (OKLCH para light/dark). Título de pestaña dinámico con el nombre de la institución.
- 100% offline — sin dependencias externas, sin CDNs, sin telemetría. Todos los recursos bundleados localmente.
Arquitectura
- Single source of truth en personas: socios y autoridades tienen columnas que son fórmulas de Grist (pull de
$persona_id), no datos almacenados. Cambiar una persona actualiza automáticamente todos sus registros vinculados. - Migraciones automáticas:
ensureSchemadetecta columnas que necesitan convertirse a fórmulas y las migra. Reparación de refs rotas, migración de datos legacy y deduplicación de personas por DNI. - Router por hash con persistencia de última ruta en widget options de Grist.
- Fórmulas de Grist: período (desde fecha), activo en socios (!fecha_baja), habilitado electoral, saldo inicial total del ejercicio.
Las capturas de pantalla y videos de ejemplo se encuentran en la landing page.
cp docker/grist/grist.env.example .env # solo la primera vez
docker compose up -d --build| Servicio | URL | Rol |
|---|---|---|
| Grist | http://localhost:8089 |
Backend — documento SQLite con todas las tablas |
| LOF | http://localhost:8088 |
Frontend — la SPA servida por nginx |
Pasos: abrir Grist → crear documento → Add New → Add Widget to Page → Custom → pegar URL http://localhost:8088 → Full document access → completar wizard.
Guía completa de instalación, variables de entorno y troubleshooting en
docs/DOCKER.md.
npm install
npm run dev # http://localhost:5173# Con Docker + hot-reload
docker compose -f docker-compose.dev.yml upFuera de Grist la app muestra la landing pública. Para probar con datos reales, cargarla como Custom Widget en un documento Grist. Ver
docs/DOCKER.mdydocs/OFFLINE.md.
En entorno de desarrollo, el primer paso del setup wizard incluye dos switches para agilizar pruebas:
- Precargar datos demo en todos los pasos — rellena automáticamente los campos de cada paso (módulos, escuela, banco, ejercicio, cargos) con datos de ejemplo. Reemplaza al botón "Precargar datos demo" que aparece en cada paso cuando no está activo.
- Cargar datos de prueba tras instalar — ejecuta un seeder que genera datos realistas para probar performance de listados, filtros y reportes. El formulario pide primero la cantidad de ejercicios (campo principal, siempre editable) y un switch "Customizar cantidades":
- Customización apagada (default): los demás campos (personas, socios, movimientos extra, batch, asambleas) se auto-sugieren según la cantidad de ejercicios y el modo de gestión seleccionado. Los valores se actualizan automáticamente al cambiar el número de ejercicios.
- Customización encendida: todos los campos son editables manualmente.
- Modo-aware: el seeder ajusta los datos según el modo de gestión:
- Gestión integral: genera cuota social mensual por socio activo (90% pago, 10% morosidad natural) con importes realistas ($1500-5000 actual, $1000-3000 histórico), vinculada a
socio_idypersona_idpara probar morosidad individual. Más movimientos extra para variedad de gastos. - Carga consolidada: genera movimientos PIA por rubro/cuenta/período con períodos firmados y abiertos. Menos socios porque no hay cuota social individual.
- Gestión integral: genera cuota social mensual por socio activo (90% pago, 10% morosidad natural) con importes realistas ($1500-5000 actual, $1000-3000 histórico), vinculada a
- Continuidad de autoridades: cada ejercicio tiene sus autoridades de CD/CRC designadas, con ~60% de continuidad entre ejercicios (misma persona en el mismo cargo) y ~40% de renovación. Los ejercicios anteriores se crean como cerrados con
fecha_cierre. - Mínimo 1 asamblea por ejercicio: la primera es siempre AGO; si se configuran más, se generan AGE adicionales para probar cambio de autoridades dentro del ejercicio.
- Estimación en tiempo real: el formulario muestra cuántos movimientos y asambleas totales se generarán según la configuración.
El seeder solo está disponible cuando import.meta.env.DEV es true y no viaja en el bundle de producción.
| Documento | Contenido |
|---|---|
docs/ARQUITECTURA.md |
Arquitectura detallada, capas, flujo de datos, integración con Grist |
docs/PATRONES.md |
Patrones de código: runes, stores reactivos, routing, schema |
docs/TECNOLOGIAS.md |
Stack tecnológico y justificación de decisiones |
docs/DOCKER.md |
Guía completa de Docker (producción y desarrollo) |
docs/OFFLINE.md |
Escenarios offline, verificación y migración cloud → local |
docs/modulos/ |
Especificación funcional y técnica por módulo |
| Estado | Item |
|---|---|
| Listo | PIA y Nómina en PDF — generación automática desde los datos del ejercicio |
| Listo | Comunidad unificada y carga de autoridades desde asambleas — padrón unificado con toggle de socio, wizard inline con selección por organismo |
| Listo | Módulo Institucional — separación de la información formal como módulo de primera clase, con cargos, autoridades vigentes, ceses, reemplazos e histórico interactivo |
| Listo | Cargas consolidadas con firma a nivel período — múltiples cargas por período, firma/cierre a nivel período, resumen semanal secuencial, layout de dos columnas en gestión por etapas |
| Listo | Dashboard de inicio con situación actual — saldos por cuenta, última carga, período actual, alerta de ejercicio sin activar |
| Listo | Resumen analítico con tabs y gráficos — flujo de caja, gastos/ingresos, comparativa interanual, morosidad y salud operativa |
| Listo | Cierre automático con próximo ejercicio — al cerrar el activo, crea el siguiente con saldos arrastrados |
| Listo | Periodicidad configurable — mensual, semanal, trimestral, semestral o anual, con agrupación automática de cargas existentes |
| Listo | Morosidad inteligente — detecta datos mixtos (vinculados + no vinculados) y calcula deudores solo sobre el tramo identificable |
| Próximo | Adjuntos y actas — carga guiada de comprobantes con trazabilidad |
| Después | Balance de tesorería exportable |
| Después | Accesos y roles — permisos por tesorería, comisión, asesoría |
| Futuro | App móvil — consulta de saldos, movimientos, notificaciones |
| Futuro | Conciliación bancaria — carga de resúmenes del Banco Provincia y conciliación automática o guiada |
| Futuro | Integraciones — DIPREGEP y herramientas de gestión escolar |
El detalle completo de funcionalidades, capturas y lo que viene está en la landing page.
Svelte 5 (runes) · Vite 8 · Tailwind CSS 4 · shadcn-svelte + bits-ui · Grist (backend) · Docker + nginx · Vitest
Las contribuciones son bienvenidas. Abrí un issue o un PR en el repositorio.
AGPL-3.0 — Software libre. La comunidad puede auditar, modificar y distribuir.
