RF21: Usuario registra patrimonio
Descripción
Como usuario autenticado, quiero registrar mis activos patrimoniales (propiedades, vehículos, ahorros, inversiones externas) para conocer mi patrimonio neto y recibir mejores recomendaciones.
El valor de cada activo se cifra a nivel de campo. El patrimonio neto se calcula como activos menos deudas (RF22).
| Campo | Valor |
|---|---|
| Módulo | Finance Data Collection (FDC) Module |
| Actor | Usuario autenticado |
| Endpoint | POST /finance/assets |
| Precondiciones | Sesión activa |
| Prioridad | Media (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF22, RF12, RF28 |
Reglas de negocio
- RN-21.1 — Un activo tiene tipo (catálogo: inmueble, vehículo, ahorro, inversión, otro), nombre, valor estimado y (opcional) fecha de valuación.
- RN-21.2 —
valuese cifra a nivel de campo (AES-256-GCM, clave por usuario). - RN-21.3 — El patrimonio neto se recalcula al agregar/editar/eliminar activos o deudas.
- RN-21.4 — El usuario puede editar o eliminar un activo.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
type | Obligatorio. Valor de catálogo. | "Selecciona un tipo de activo válido." |
name | Obligatorio. 2–80 caracteres. | "Ingresa un nombre válido." |
value | Obligatorio. Numérico ≥ 0. Máx. 2 decimales. | "Ingresa un valor válido." |
Validación de tipos y consultas parametrizadas; no se aceptan inyecciones SQL.
Criterios de aceptación
Escenario 1: Registro de activo exitoso
Dado que ingreso tipo, nombre y valor válidos,
Cuando guardo el activo,
Entonces el sistema lo persiste (valor cifrado) y responde 201 Created,
Y el patrimonio neto se actualiza en el dashboard.
Escenario 2: Valor inválido
Dado que ingreso un valor negativo o no numérico,
Cuando intento guardar,
Entonces el sistema responde 400 con "Ingresa un valor válido".
Escenario 3: Tipo no válido
Dado que envío un tipo fuera del catálogo,
Cuando el backend valida,
Entonces responde 400 con "Selecciona un tipo de activo válido".
Escenario 4: Entrada maliciosa (seguridad)
Dado que ingreso una inyección SQL en el nombre, Cuando el backend procesa, Entonces la entrada se rechaza/sanitiza y no se ejecuta.
Criterios no funcionales
- Valor cifrado en reposo; respuesta < 1 s.
- Comunicación TLS 1.2+.