Este documento define el propósito, entidades y reglas de negocio del backend.
Finward es una app B2C de finanzas personales. Cada usuario gestiona su propia información financiera. No hay multitenancy ni workspaces: 1 usuario = 1 cuenta personal.
- Usuario autenticado por Supabase Auth (
auth.users). - Datos de perfil: nombre, moneda (MXN), timezone (America/Mexico_City).
- Opcional: ingreso mensual, frecuencia de ingresos, score financiero.
userIden todas las tablas =auth.uid()de Supabase.
Cuenta financiera del usuario.
| Tipo | Significado | Balance |
|---|---|---|
| CASH | Efectivo | Activo (positivo = dinero disponible) |
| DEBIT | Cuenta de débito | Activo (positivo) |
| CREDIT | Tarjeta de crédito | Pasivo (positivo = deuda) |
| LOAN | Préstamo | Pasivo (positivo = deuda) |
| INVESTMENT | Inversión | Activo |
| SAVINGS | Ahorro | Activo |
cutoffDay,daysToPayAfterCutoff: Para TDC (ej. corte día 15, pago 20 días después).creditLimit: Para TDC.balance: Cache del balance actual (actualizado vía Ledger).
Registro de una operación financiera.
type: income | expense | transferamount: Monto (siempre positivo).description,date,status(completed | pending).accountId,destinationAccountId(transferencias).categoryId: Categoría del gasto/ingreso.installmentPurchaseId,loanId,recurringTransactionId,statementId: Vínculos.
Cada transacción genera 2+ entradas en el Ledger que suman 0 (débitos = créditos).
| Campo | Descripción |
|---|---|
| accountId | Cuenta afectada |
| transactionId | Transacción origen |
| amount | + = crédito, - = débito |
| type | debit |
Reglas:
- Suma de
amountpor transacción = 0. - Balance de cuenta =
SUM(amount)de sus LedgerEntries.
Categoría de gasto/ingreso (ej. Alimentación, Transporte). type: income | expense. budgetType: needs | wants | savings.
Compra a meses sin intereses.
totalAmount,installments,monthlyPayment,purchaseDate.paidInstallments,paidAmount: Progreso del pago.- Cada cuota mensual genera una transacción de pago (transferencia a la TDC).
Préstamo (me deben / debo). loanType: lent | borrowed. originalAmount, remainingAmount, status (active | partial | paid).
Estado de cuenta de TDC generado en el día de corte.
cycleStart,cycleEnd,paymentDueDate.totalDue,minimumPayment,regularAmount,msiAmount.status: PENDING | PAID | PARTIAL | OVERDUE.
Balance de una cuenta en una fecha (para gráficas de evolución). Job diario 23:55.
Meta de ahorro. targetAmount, currentAmount, deadline.
- Gasto con efectivo/débito: -Account (débito), +Gasto (o categoría).
- Gasto con TDC: +Pasivo TDC (crédito = aumenta deuda), +Gasto. No toca banco.
- Pago de TDC: -Banco (débito), -Pasivo TDC (débito = reduce deuda).
- Transferencia: -Origen, +Destino.
- Ingreso: +Cuenta, +Categoría ingreso.
cutoffDay: Día de corte (ej. 15).daysToPayAfterCutoff: Días naturales para pagar después del corte (ej. 20 o 30).- Ciclo: desde día después del corte anterior hasta el día de corte actual.
- Job diario 00:05: genera
CreditCardStatementpara cuentas cuyocutoffDay= hoy.
- Cada cuota se carga el mismo día del mes que la compra.
- La cuota mensual genera una transacción de transferencia (banco → TDC) cuando el usuario la paga.
- Estado de cuenta (statement): El
msiTotalincluye solo las cuotas con vencimiento entrecycleStartDateypaymentDatedel ciclo. UsagetMsiAmountForBillingCycle()(msiForStatement.ts) conexpandMsiInPeriod.
- Crear gasto: Validar cuenta, categoría → crear Transaction → crear LedgerEntries (débito cuenta, crédito gasto) → actualizar balance cache.
- Pagar TDC: Validar origen y destino → crear Transaction (transfer) → LedgerEntries → actualizar balances.
- Pago MSI: Crear transfer con
installmentPurchaseId→ actualizarpaidInstallments,paidAmount. - Corte diario: Job identifica TDC con cutoff=hoy → calcula totalDue (gastos regulares + MSI del ciclo) → crea CreditCardStatement.
computeFinancialBalances() (financialBalances.ts):
- availableFunds: DEBIT + CASH + SAVINGS (dinero líquido).
- totalAssets: Cuentas no-deuda + inversiones + metas de ahorro + préstamos prestados (lent).
- totalLiabilities: CREDIT + LOAN + préstamos recibidos (borrowed).
- netWorth: totalAssets - totalLiabilities.
Usado por Financial Planning, Dashboard y contexto AI.
- CALCULATIONS.md — Fórmulas detalladas (MSI, proyección, redondeo)