RF13: Usuario registra RFC
Descripción
Como usuario autenticado, quiero registrar mi RFC para poder generar mi declaración anual y solicitar facturas electrónicas.
El RFC es un dato de identificación fiscal de sensibilidad media; se almacena en Finnova DB con cifrado de disco (EBS) y se valida contra el formato oficial del SAT.
| Campo | Valor |
|---|---|
| Módulo | Finance Data Collection (FDC) Module |
| Actor | Usuario autenticado |
| Endpoint | PUT /finance/rfc |
| Precondiciones | Sesión activa |
| Prioridad | Media (habilita Accounting — RF40, RF63) |
| Etapa | MVP |
| Requisitos relacionados | RF40, RF63 |
Reglas de negocio
- RN-13.1 — El RFC se valida contra el formato oficial (persona física: 13 caracteres; moral: 12), incluyendo homoclave.
- RN-13.2 — El RFC se normaliza a mayúsculas y se elimina espacios.
- RN-13.3 — Un mismo usuario tiene un único RFC; registrar de nuevo lo actualiza.
- RN-13.4 — Tratado como dato personal: cifrado en reposo y no expuesto en logs.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
rfc | Obligatorio. Formato SAT válido (regex). 12–13 caracteres. | "Ingresa un RFC válido." |
Validación por expresión regular del formato SAT y consultas parametrizadas; no se aceptan inyecciones SQL ni caracteres fuera del patrón.
Criterios de aceptación
Escenario 1: Registro de RFC exitoso
Dado que ingreso un RFC con formato válido,
Cuando lo guardo,
Entonces el sistema lo normaliza, lo persiste cifrado y responde 200 OK,
Y habilita las funciones fiscales (factura, declaración).
Escenario 2: RFC con formato inválido
Dado que ingreso un RFC mal formado (longitud o patrón incorrecto),
Cuando intento guardarlo,
Entonces el sistema responde 400 con "Ingresa un RFC válido",
Y no se persiste.
Escenario 3: Actualización de RFC existente
Dado que ya tengo un RFC registrado, Cuando registro uno nuevo válido, Entonces el sistema reemplaza el anterior.
Escenario 4: Entrada maliciosa (seguridad)
Dado que ingreso caracteres con intento de inyección SQL, Cuando el backend valida, Entonces la entrada se rechaza por no cumplir el patrón y la inyección no se ejecuta.
Criterios no funcionales
- RFC cifrado en reposo; no aparece en logs.
- Comunicación sobre TLS 1.2+.