RF17: Usuario registra gasto fijo
Descripción
Como usuario autenticado, quiero registrar mis gastos fijos recurrentes (renta, servicios, suscripciones) para que Finnova los descuente de mi presupuesto automáticamente cada periodo.
Análogo a RF16 pero del lado del gasto; define un egreso recurrente con periodicidad. El monto se cifra a nivel de campo.
| Campo | Valor |
|---|---|
| Módulo | Finance Data Collection (FDC) Module |
| Actor | Usuario autenticado |
| Endpoint | POST /finance/recurring-expenses |
| Precondiciones | Sesión activa |
| Prioridad | Alta (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF16, RF18, RF12 |
Reglas de negocio
- RN-17.1 — Un gasto fijo tiene concepto, categoría, monto, día del mes y (opcional) fecha de fin.
- RN-17.2 — El monto se cifra a nivel de campo (AES-256-GCM, clave por usuario).
- RN-17.3 — Los gastos fijos se proyectan al presupuesto del periodo y alimentan el análisis de "fugas" de la IA.
- RN-17.4 — El usuario puede editar o eliminar un gasto fijo.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
concept | Obligatorio. 2–80 caracteres. | "Ingresa un concepto válido." |
category | Obligatorio. Valor de catálogo. | "Selecciona una categoría válida." |
amount | Obligatorio. Numérico > 0. Máx. 2 decimales. | "Ingresa un monto válido mayor a 0." |
dayOfMonth | Obligatorio. Entero 1–31. | "Selecciona un día válido del mes." |
Validación de tipos y consultas parametrizadas; no se aceptan inyecciones SQL.
Criterios de aceptación
Escenario 1: Registro exitoso
Dado que ingreso concepto, categoría, monto positivo y día del mes,
Cuando guardo el gasto fijo,
Entonces el sistema lo persiste (monto cifrado) y responde 201 Created,
Y el presupuesto del dashboard lo refleja como egreso recurrente.
Escenario 2: Monto o día inválidos
Dado que ingreso un monto ≤ 0 o un día fuera de 1–31,
Cuando intento guardar,
Entonces el sistema responde 400 con el mensaje correspondiente.
Escenario 3: Categoría no válida
Dado que envío una categoría inexistente,
Cuando el backend valida,
Entonces responde 400 con "Selecciona una categoría válida".
Escenario 4: Entrada maliciosa (seguridad)
Dado que ingreso una inyección SQL en el concepto, Cuando el backend procesa, Entonces la entrada se rechaza/sanitiza y no se ejecuta.
Criterios no funcionales
- Monto cifrado en reposo; respuesta < 1 s.
- Comunicación TLS 1.2+.