Saltar al contenido principal

RF20: Usuario captura foto de ticket de compra

Descripción

Como usuario autenticado, quiero tomar una foto de mi ticket de compra para registrar el gasto sin capturarlo manualmente, dejando que el sistema extraiga monto, fecha y comercio.

La imagen se sube a un bucket privado de S3 (SSE-S3, acceso solo por URLs prefirmadas — Cifrado §4.3). El backend procesa la imagen con OCR para proponer un gasto (RF18) que el usuario confirma.

CampoValor
MóduloFinance Data Collection (FDC) Module
ActorUsuario autenticado
EndpointPOST /finance/tickets (sube imagen) → propone gasto
PrecondicionesSesión activa; permiso de cámara concedido
PrioridadMedia (MVP/post-MVP)
EtapaMVP
Requisitos relacionadosRF18, RF64

Reglas de negocio

  • RN-20.1 — Formatos permitidos: JPG/PNG/HEIC. Tamaño máximo: 10 MB.
  • RN-20.2 — La imagen se almacena en S3 privado; nunca pública. Acceso por URL prefirmada con expiración corta.
  • RN-20.3 — El OCR propone los datos (monto, fecha, comercio); el usuario los revisa y confirma antes de crear el gasto.
  • RN-20.4 — Si el OCR no reconoce datos, el usuario captura el gasto manualmente.
  • RN-20.5 — La imagen se asocia al user_id y al gasto resultante.

Validaciones de entrada

CampoReglasMensaje de error
fileObligatorio. JPG/PNG/HEIC. ≤ 10 MB."Sube una imagen válida (JPG/PNG) de máximo 10 MB."
AuthorizationBearer válido."Sesión no válida."

Se valida el tipo MIME real y el tamaño antes de subir; se rechazan archivos ejecutables o con MIME falsificado.

Criterios de aceptación

Escenario 1: Captura y OCR exitosos

Dado que tomo una foto legible de un ticket, Cuando la subo, Entonces el sistema la guarda en S3 privado, Y el OCR extrae monto, fecha y comercio, Y me presenta un gasto pre-llenado para confirmar, Y al confirmar se crea el gasto (RF18).

Escenario 2: OCR no reconoce datos

Dado que la foto es borrosa o el ticket no es legible, Cuando el OCR no extrae datos confiables, Entonces el sistema me permite capturar el gasto manualmente, Y conserva la imagen como adjunto.

Escenario 3: Archivo inválido o muy pesado (validación)

Dado que subo un archivo no permitido o mayor a 10 MB, Cuando intento subirlo, Entonces el sistema responde 400 con "Sube una imagen válida (JPG/PNG) de máximo 10 MB".

Escenario 4: Acceso a la imagen (seguridad)

Dado que la imagen está en S3, Cuando se necesita mostrarla, Entonces se entrega mediante URL prefirmada con expiración corta, Y ningún tercero puede acceder a la imagen directamente.

Criterios no funcionales

  • Bucket con "Block all public access" y SSE-S3.
  • Subida y OCR en segundo plano sin congelar la UI.
  • Comunicación TLS 1.2+.

Diagrama de secuencia