Saltar al contenido principal

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.

CampoValor
MóduloFinance Data Collection (FDC) Module
ActorUsuario autenticado
EndpointPOST /finance/recurring-expenses
PrecondicionesSesión activa
PrioridadAlta (MVP)
EtapaMVP
Requisitos relacionadosRF16, 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

CampoReglasMensaje de error
conceptObligatorio. 2–80 caracteres."Ingresa un concepto válido."
categoryObligatorio. Valor de catálogo."Selecciona una categoría válida."
amountObligatorio. Numérico > 0. Máx. 2 decimales."Ingresa un monto válido mayor a 0."
dayOfMonthObligatorio. 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+.

Diagrama de secuencia