Saltar al contenido principal

RF19: Usuario registra ingreso

Descripción

Como usuario autenticado, quiero registrar un ingreso puntual para mantener mi balance al día con entradas de dinero no recurrentes.

Movimiento de ingreso no recurrente (a diferencia del ingreso mensual, RF16). El monto se cifra a nivel de campo.

CampoValor
MóduloFinance Data Collection (FDC) Module
ActorUsuario autenticado
EndpointPOST /finance/transactions (type: income)
PrecondicionesSesión activa
PrioridadAlta (MVP)
EtapaMVP
Requisitos relacionadosRF16, RF18, RF12

Reglas de negocio

  • RN-19.1 — Un ingreso tiene monto, fecha, categoría/fuente y (opcional) descripción.
  • RN-19.2amount y description se cifran a nivel de campo (AES-256-GCM, clave por usuario).
  • RN-19.3 — La fecha no puede ser futura.
  • RN-19.4 — El usuario puede editar o eliminar el ingreso.
  • RN-19.5 — El monto se maneja como decimal de precisión fija con código de moneda (MXN por defecto), conforme a RNF-05.
  • RN-19.6 — La creación acepta idempotency key para no duplicar el ingreso 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."
source/categoryObligatorio. Valor de catálogo."Selecciona una fuente válida."
descriptionOpcional. Máx. 120 caracteres."El texto es demasiado largo."

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

Criterios de aceptación

Escenario 1: Registro de ingreso exitoso

Dado que ingreso monto positivo, fecha no futura y fuente, Cuando guardo el ingreso, Entonces el sistema lo persiste (campos cifrados) y responde 201 Created, Y se refleja en el dashboard y en el saldo 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 descripción, 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