Saltar al contenido principal

RF23: Usuario registra gasto en efectivo

Descripción

Como usuario autenticado, quiero registrar gastos pagados en efectivo para que mi control financiero incluya el dinero que no pasa por mis cuentas bancarias.

Es un gasto puntual (RF18) marcado con método de pago cash. Importa porque los gastos en efectivo no se importan automáticamente del banco y son una "fuga" típica que la IA analiza.

CampoValor
MóduloFinance Data Collection (FDC) Module
ActorUsuario autenticado
EndpointPOST /finance/transactions (type: expense, method: cash)
PrecondicionesSesión activa
PrioridadMedia (MVP)
EtapaMVP
Requisitos relacionadosRF18, RF12

Reglas de negocio

  • RN-23.1 — Mismo modelo que un gasto, con paymentMethod = 'cash'.
  • RN-23.2 — No se concilia con movimientos bancarios (es manual por definición).
  • RN-23.3amount y description se cifran a nivel de campo.
  • RN-23.4 — La fecha no puede ser futura.
  • RN-23.5 — El monto se maneja como decimal de precisión fija con código de moneda (MXN por defecto), conforme a RNF-05.
  • RN-23.6 — La creación acepta idempotency key para no duplicar el gasto ante reintentos (RNF-09).

Validaciones de entrada

CampoReglasMensaje de error
amountObligatorio. Numérico > 0. Máx. 2 decimales."Ingresa un monto válido mayor a 0."
dateObligatorio. No futura."La fecha no puede ser posterior a hoy."
categoryObligatorio. Valor de catálogo."Selecciona una categoría válida."

Validación de tipos/fecha y consultas parametrizadas; no se aceptan inyecciones SQL.

Criterios de aceptación

Escenario 1: Registro de gasto en efectivo exitoso

Dado que ingreso monto positivo, fecha no futura y categoría, Cuando guardo el gasto en efectivo, Entonces el sistema lo persiste con paymentMethod = 'cash' (campos cifrados) y responde 201 Created, Y se refleja en el dashboard como gasto del periodo.

Escenario 2: Monto inválido

Dado que ingreso un monto ≤ 0 o no numérico, Cuando intento guardar, Entonces el sistema responde 400 con "Ingresa un monto válido mayor a 0".

Escenario 3: Fecha futura

Dado que selecciono una fecha posterior a hoy, Cuando intento guardar, Entonces el sistema responde 400 con "La fecha no puede ser posterior a hoy".

Escenario 4: Entrada no esperada (seguridad)

Dado que ingreso letras en el monto o una inyección SQL en la categoría, Cuando el backend valida, Entonces la entrada se rechaza y la inyección no se ejecuta.

Criterios no funcionales

  • Campos sensibles cifrados; respuesta < 1 s.
  • Idempotencia en la creación (RNF-09); monto decimal + moneda (RNF-05).
  • Comunicación TLS 1.2+.

Diagrama de secuencia