Give your agent a wallet you control.
Let your agents pay online using one-time-use cards or with machine payment protocols. You approve every request.
Control del fondo mutuo familiar
Translation pending
FinanceGitHub @abelopez89OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Aplicación de gestión financiera familiar: ingresos, gastos, plantillas mensuales, control del fondo mutuo y previsiones a 12 meses.
Etapa 1 — completada: infraestructura base.
linkIdentity)supabase/schema.sql), en esquema dedicado finanzas_py para convivir con otras apps del mismo proyecto SupabaseEtapa 2 — completada: plantillas y aplicación mensual.
/plantillas: alta, edición (día/monto/método/categoría) y activación de plantillas de gastos e ingresos mensuales/mes-actual: respeta el ciclo de facturación 27–26; botón para generar los movimientos del período vigente a partir de las plantillas activas (sin duplicar si ya existen)fund_movements); si se revierte el estado, el movimiento se elimina para mantener el saldo consistentemiddleware.ts, que obliga a iniciar sesión para cualquier página que no sea /login, y redirige al dashboard si ya estás logueado y entrás a /login. También se agregó el botón de "Cerrar sesión" (con el email de la cuenta activa) en el sidebar, y se separó el layout para que /login no muestre el menú lateral.SECURITY DEFINER (create_account_for_user, link_email_to_my_account) en vez de inserts directos, evitando un problema de RLS+RETURNING en la primera fila de un usuario nuevo.Etapa 3 — completada: extras y control de saldo del fondo.
/extras: alta de gastos e ingresos puntuales (con fecha de vencimiento/aplicación, no plantilla), mismos estados y misma lógica de libro mayor que los movimientos regulares/fondo: carga única de saldo inicial; registro del saldo real informado por el usuario con cálculo automático del interés generado (diferencia contra el saldo calculado por el sistema); historial de chequeos de saldo; libro mayor de los últimos movimientos del fondoupdateExpenseEntry, cambiarEstadoGasto, etc.) se centralizaron en src/lib/actions/entries.ts, compartidas entre /mes-actual y /extrascolSpan a un grid CSS por fila)Etapa 4 — completada: dashboard, previsiones y extracto.
/ (Dashboard): saldo actual del fondo, gráfico de ingresos vs. egresos de los últimos 6 períodos, y tabla de próximos vencimientos del período vigente/previsiones: proyección de saldo a 12 períodos, asumiendo que las plantillas activas se repiten; arranca del saldo real ajustado por lo pendiente del período actual; alerta si el saldo proyectado se vuelve negativo, con la fila resaltada en rojo (igual que el Excel anterior); gráfico de evolución/extracto: descarga en CSV de los movimientos confirmados del fondo, filtrado por rango de fechasNota de diseño: a diferencia del Excel anterior, las plantillas de este sistema no tienen banderas mes a mes (como las columnas Ene–Dic para "Cuota Rafa"/"Cuota Benja" aplicando solo Feb–Nov). Por ahora todas las plantillas activas se proyectan como recurrentes en todos los períodos. Si hace falta ese nivel de detalle estacional, se puede agregar como mejora — avisame si lo querés para la próxima etapa.
Ajustes post-Etapa 4:
/configuracion, con pestañas internas). El sidebar bajó de 10 a 8 ítems./mes-actual, si el período vigente todavía no tiene movimientos generados desde las plantillas, se crean solos (mismo mecanismo idempotente que el botón manual, que sigue disponible por si se agrega una plantilla nueva después)./movimientos): vista unificada de TODOS los gastos e ingresos de la cuenta (regulares y extra), con filtros por nombre/tipo/origen/estado/fecha, totales, y descarga en Excel (antes era CSV) reflejando los mismos filtros aplicados.Ajustes adicionales:
/extras con una fecha futura, se va a sumar automáticamente al período que le corresponde en la proyección de 12 meses (se marca con una etiqueta "+ extra" en la tabla). Esto requirió corregir un bug: el campo periodo de un extra se calculaba con la fecha de HOY en vez de con la fecha de vencimiento/aplicación elegida, por lo que un extra futuro terminaba mal ubicado.fund_movements) se actualiza junto con él, para que el saldo del fondo siga siendo consistente.GastosTemplateTable e IngresosTemplateTable).Reorganización mayor (post-Etapa 4, ronda 2):
/movimientos ya no existe como pantalla separada; todo su contenido (filtros, totales, descarga Excel) ahora vive dentro de /fondo, debajo del saldo actual y del registro de saldo del fondo. Además, la lista de movimientos ahora también incluye los intereses y el saldo inicial (antes esos solo se veían en la sección vieja de "últimos movimientos" del fondo, separados de gastos/ingresos)./configuracion/plantillas).Etapa 5 — completada: notificaciones diarias por Telegram.
src/lib/avisos.ts arma el mensaje: gastos que vencen hoy, atrasados sin rescatar, total a rescatar antes del mediodía y saldo del fondo. Calcula la fecha real de cada gasto (los extras la tienen explícita; los regulares se derivan del período 27–26 y el día).GET /api/cron/notificar-vencimientos recorre las cuentas con destinatarios activos y envía. Autenticación por Authorization: Bearer <CRON_SECRET> o ?token=<CRON_SECRET>.Alcance original completo. Todos los requisitos funcionales del pedido inicial están implementados.
Este proyecto está pensado para compartir un proyecto de Supabase existente (por ejemplo
vacamanageroirp-py) sin afectar esas apps: todas las tablas de finanzas-py viven en su propio esquema de Postgres,finanzas_py, separado depublic. También podés usar un proyecto nuevo si preferís; el esquema dedicado funciona igual en ambos casos.
supabase/schema.sql. Esto crea el esquema finanzas_py y todas las tablas ahí adentro — no toca nada de public ni de otros esquemas.finanzas_py a la lista (sin sacar public, que puede estar en uso por las otras apps). Sin este paso, el cliente de Supabase no puede leer ni escribir estas tablas.https://<tu-dominio>.vercel.app/api/auth/callback (agregarla a la lista existente, no reemplaza las de las otras apps).Nota sobre reutilizar el proyecto: la tabla
auth.usersde Supabase es compartida por todas las apps del mismo proyecto (es la única parte no aislada por esquema). Esto no genera conflicto: si te logueás con el mismo Gmail que usás en vacamanager o irp-py, simplemente ya existe ese usuario enauth.users, y finanzas-py de todos modos solo ve y escribe filas definanzas_py.account_users— sus propios datos, sin mezclarse con las otras apps.
Copiar .env.example a .env.local y completar con los valores de tu proyecto de Supabase y tu bot de Telegram.
npm install
npm run dev
.env.local en la configuración del proyecto en Vercel.https://<tu-dominio>.vercel.app/api/cron/notificar-vencimientosAuthorization: Bearer <CRON_SECRET> (el mismo valor que pusiste en la variable de entorno CRON_SECRET).Una vez logueado con el primer correo, desde Configuración (se habilita en Etapa 2) se puede invocar linkIdentity para sumar el segundo Gmail a la misma cuenta familiar, sin crear una cuenta separada.
Ejecutar en el SQL Editor de Supabase:
supabase/optimizaciones_performance.sql
Crea dos tablas nuevas (entry_omisiones, period_generations) y varios
índices. Es idempotente. Sin este script la app sigue funcionando, pero el
borrado de movimientos regulares vuelve a fallar (reaparecen) y no hay ganancia
de velocidad en /mes-actual.
Bug de eliminación. /mes-actual regenera los movimientos desde las
plantillas en cada render. Al borrar un gasto regular, el render inmediatamente
posterior lo volvía a crear: parecía que el botón "Eliminar" no hacía nada.
Ahora, al borrar un movimiento que vino de una plantilla, se anota la omisión en
entry_omisiones y esa plantilla ya no se regenera para ese período. Si el
borrado fue sin querer, aparece un botón "Restaurar movimientos eliminados" al
pie de la página.
Lentitud al cambiar de estado. Tres frentes:
.select() y la búsqueda
del movimiento del fondo va en paralelo)./mes-actual. La autenticación se memoiza por request en vez de
consultarse 2-3 veces.Ejecutar en el SQL Editor de Supabase:
supabase/sincronizar_metodo_categoria_gastos.sql
Sincroniza, de una sola vez, el método de pago y la categoría de todos los gastos ya generados con los de su plantilla actual. Es idempotente. Sin este script, los gastos generados antes de este cambio van a seguir mostrando el método/categoría viejo hasta que se edite la plantilla de nuevo.
A diferencia del monto (que tiene vigencias y queda "congelado" en la fecha
de cada movimiento), método de pago y categoría son solo datos de
clasificación. Antes, cambiar cualquiera de los dos en una plantilla
(Configuración → Plantillas) no se reflejaba en los gastos ya generados
desde ella — ni los históricos ni los del mes actual, que seguían mostrando
el valor con el que se habían generado. Ahora, al editar una plantilla, el
cambio se propaga automáticamente a todos los gastos generados desde ella,
sin importar su estado.
/salario)Ejecutar en el SQL Editor de Supabase:
supabase/descuentos_salario.sql
Crea tres tablas nuevas en finanzas_py (salary_sources,
salary_deductions, salary_deduction_payments) con RLS y el patrón de
auth_account_ids(). Es idempotente. Sin este script la pantalla /salario
aparece vacía y no permite guardar nada, pero el resto de la app (y el
aviso diario) sigue funcionando igual.
Registro y recordatorio de lo que se paga con el salario antes de
transferir al fondo mutuo: cuotas de préstamos, otros descuentos y la propia
transferencia al fondo. Es un módulo aparte: no escribe ni lee
fund_movements, income_entries ni expense_entries, así que no cambia el
saldo del fondo, las previsiones, el extracto mensual ni los rescates.
prestamo, transferencia_fondo u otro,
monto de la cuota y, para préstamos, cuotas totales (opcional) y cuotas ya
pagadas antes de empezar a usar el módulo.src/lib/period.ts. La fecha del recordatorio
es el día de cobro de la fuente dentro de ese período.src/lib/salario.ts): no se generan filas por adelantado
ni se usa period_generations/entry_omisiones. Solo cuenta el período
vigente: un concepto que no se registró en un período ya cerrado no se
arrastra al siguiente.cuotas_cubiertas de los registros pagado. El fin estimado es la fecha de
cobro del período en que cae la última cuota.omitido, deja de figurar como pendiente.unique (salary_deduction_id, periodo)):
el adelanto va en ese mismo registro con cuotas_cubiertas > 1./salario (menú "Salario"): una tarjeta por salario con bruto, descuentos
del período y su estado, cuotas restantes y fin estimado, y lo transferido
al fondo. En escritorio el formulario de pago de un pendiente está siempre
visible; en móvil va detrás de "Editar"/"Cerrar".Ejecutar en el SQL Editor de Supabase:
supabase/cuotas_plantillas.sql
Agrega cuotas_total y cuotas_pagadas_inicial a expense_templates, y
numero_cuota a expense_entries. Es idempotente. Sin este script, Mes
actual, Configuración → Plantillas y Previsiones fallan, porque ya leen
esas columnas.
Mismo concepto que los préstamos de /salario, aplicado a los gastos de la
plantilla mensual (src/lib/cuotas.ts):
cuotas_pagadas_inicial). Dejar
"Cuotas totales" vacío lo vuelve un gasto sin fin, como antes.numero_cuota) y Mes actual
muestra "cuota 13 de 60". Se congela al generar, como el monto; si se
cambia la configuración de cuotas de la plantilla, se renumeran los gastos
ya generados de esa plantilla.SeccionPlegable): se usan de vez en cuando. Plegado, el primero igual
muestra el último registro (fecha y saldo).Los días fijos de las plantillas caen en sábado o domingo según el mes, y esos días no se pueden hacer los rescates del fondo. Por ahora es solo aviso: la fecha se corrige a mano.