Skip to content

Repository files navigation

LOF

LOF

Lazos que Organizan el Futuro
Gestión integral para cooperadoras escolares de la Provincia de Buenos Aires.

License Stars Issues Svelte 5 Grist

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.

Características

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: ensureSchema detecta 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.

Inicio rápido

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 NewAdd Widget to PageCustom → pegar URL http://localhost:8088Full document access → completar wizard.

Guía completa de instalación, variables de entorno y troubleshooting en docs/DOCKER.md.

Desarrollo

npm install
npm run dev          # http://localhost:5173
# Con Docker + hot-reload
docker compose -f docker-compose.dev.yml up

Fuera 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.md y docs/OFFLINE.md.

Seeder de datos de prueba (dev)

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_id y persona_id para 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.
  • 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.

Setup paso 1 con seeder de datos de prueba en dev

Documentació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

Roadmap

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.

Stack

Svelte 5 (runes) · Vite 8 · Tailwind CSS 4 · shadcn-svelte + bits-ui · Grist (backend) · Docker + nginx · Vitest

Contribuir

Las contribuciones son bienvenidas. Abrí un issue o un PR en el repositorio.

Licencia

AGPL-3.0 — Software libre. La comunidad puede auditar, modificar y distribuir.

About

Herramienta de gestión para cooperadoras escolares de la Provincia de Buenos Aires, Argentina. Socios, movimientos, autoridades y asambleas con Grist como backend y soberanía de datos. Software libre bajo AGPL-3.0, pensada desde el territorio.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages