Contratos BFF - martin-hendricks/MISO-PROYECTO-FINAL-SOLVENTA GitHub Wiki

Contratos BFF · payloads de las vistas

Cuerpos JSON de Solventa para lo que cada pantalla muestra. No es OpenAPI, no fija el path ni el verbo, y no es el esquema del banco, de la pasarela ni del proveedor de push. El stub sigue siendo ok / fallo / lento.

Cada bloque es el slice de Backlog BFF · Web / Móvil y back-office. La historia de la vista no se repite aquí.

La huella o el rostro no viajan en ningún cuerpo: el dispositivo desbloquea la sesión de HU-121.

HU-121 · Sesión móvil

{
  "correo": "[email protected]",
  "contrasena": "********"
}
{
  "accessToken": "jwt",
  "refreshToken": "jwt",
  "expiraEn": 900
}

POST de refresh manda solo refreshToken. Logout no lleva cuerpo.

HU-122 · Sesión web

Mismos tokens que HU-121. El cuerpo de entrada agrega el rol de escritorio.

{
  "correo": "[email protected]",
  "contrasena": "********",
  "rol": "asesor"
}

rol es cliente, asesor u operador.

HU-123 · Alta móvil y prueba de vida

La selfie se queda en el teléfono. El BFF guarda el resultado simulado.

{
  "nombre": "Camila",
  "apellidos": "Restrepo",
  "documento": "1012345678",
  "correo": "[email protected]",
  "pruebaDeVida": "ok",
  "habeasData": true
}

pruebaDeVida es ok o no. Revocar consentimiento:

{ "habeasData": false }

HU-124 · Alta web

Igual que HU-123, sin pruebaDeVida y sin cámara.

{
  "nombre": "Camila",
  "apellidos": "Restrepo",
  "documento": "1012345678",
  "correo": "[email protected]",
  "habeasData": true
}

HU-125 · Oferta móvil

{
  "ramo": "Protección de dispositivo",
  "datosRiesgo": {
    "valorDispositivo": 2400000,
    "marca": "Pixel",
    "masDe12Meses": false
  }
}

datosRiesgo cambia con el ramo (viaje: destino y duración; vida: suma y edad; clima: evento y umbral; pagos: cuota o crédito). La respuesta es la oferta en firme:

{
  "cotizacionId": "COT-1042",
  "ramo": "Protección de dispositivo",
  "estado": "oferta_vigente",
  "prima": 89000,
  "moneda": "COP",
  "venceEn": "2026-10-01"
}

Reconsultar manda solo cotizacionId y devuelve el mismo cuerpo.

HU-126 · Oferta web

Mismo par que HU-125. En venta asistida se agrega el cliente de la cartera:

{
  "clienteId": "CLI-18",
  "ramo": "Protección de dispositivo",
  "datosRiesgo": { "valorDispositivo": 2400000, "marca": "Pixel", "masDe12Meses": false }
}

HU-127 · Aceptar, emitir y billetera

{ "cotizacionId": "COT-1042" }

Éxito:

{
  "numero": "POL-88219-CO",
  "ramo": "Protección de dispositivo",
  "estado": "vigente",
  "venceEn": "2027-03-12"
}

Rechazo:

{ "estado": "rechazada", "motivo": "Valor del equipo fuera de rango" }

La billetera, online y al volver la red, es la misma lista. La app la cachea; no hay otro cuerpo para el modo offline.

{
  "polizas": [
    {
      "numero": "POL-88219-CO",
      "ramo": "Protección de dispositivo",
      "resumen": "Robo, Pantalla, Hurto",
      "estado": "vigente",
      "venceEn": "2027-03-12"
    }
  ]
}

El detalle de una póliza repite ese objeto y suma la recomendación de siniestro del ramo:

{
  "numero": "POL-88219-CO",
  "ramo": "Protección de dispositivo",
  "resumen": "Robo y Pantalla",
  "estado": "vigente",
  "venceEn": "2027-03-12",
  "queHacer": "Toma la foto del daño y anota fecha y lugar."
}

HU-128 · Emitir y consultar en web

Mismos cuerpos que HU-127, para el cliente y para el asesor.

HU-129 · Aviso, evidencia y estado

Un solo upload: foto, video, recibo o daño, y el soporte recortado. Si el usuario niega la ubicación, geo es null y el aviso sigue.

{
  "poliza": "POL-88219-CO",
  "fechaHecho": "2026-03-12",
  "geo": { "lat": 4.6533, "lng": -74.0836, "precisionM": 12 },
  "adjuntos": [
    { "tipo": "foto", "nombre": "dano.jpg" },
    { "tipo": "video", "nombre": "dano.mp4" },
    { "tipo": "recibo", "nombre": "recibo.jpg" },
    { "tipo": "soporte", "nombre": "acta.jpg" }
  ]
}
{ "siniestroId": "SIN-441", "estado": "recibido" }

Lista y detalle:

{
  "siniestros": [
    {
      "siniestroId": "SIN-441",
      "ramo": "Protección de dispositivo",
      "resumen": "Pantalla rota",
      "estado": "en_evaluacion"
    }
  ]
}

estado es recibido, en_evaluacion, decidido, enrutado o pagado.

HU-130 · Cola del operador

El cliente web reutiliza HU-129. La cola del operador:

{
  "avisos": [
    {
      "siniestroId": "SIN-441",
      "poliza": "POL-88219-CO",
      "ramo": "Protección de dispositivo",
      "estado": "en_evaluacion"
    }
  ]
}

Decisión:

{ "siniestroId": "SIN-441", "decision": "rechazar", "motivo": "Falta el recibo" }

decision es aprobar o rechazar. Sin motivo, el rechazo no se acepta.

HU-131 · Pago automático

{
  "siniestroId": "SIN-220",
  "poliza": "POL-11002-CO",
  "umbral": "retraso mayor a 120 min",
  "monto": 250000,
  "moneda": "COP",
  "estado": "pagado"
}

HU-132 · Trazabilidad web del pago automático

El mismo cuerpo de HU-131, para el cliente de escritorio y para el operador.

HU-133 · Oferta hipotecaria móvil

{
  "credito": { "valor": 180000000, "plazoMeses": 180 },
  "consentimientoPerfil": true
}
{
  "ramo": "Vida crediticia",
  "estado": "oferta_vigente",
  "prima": 64000,
  "moneda": "COP",
  "factores": ["plazo", "valor del crédito"],
  "degradada": false
}

Si el perfilamiento stub no llega a tiempo, degradada es true y la prima es el valor de respaldo.

HU-134 · Oferta hipotecaria web

El mismo cuerpo de HU-133, para el cliente y para el asesor.

HU-135 · Avisos in-app de vigencia

No lleva token de push. Eso es HU-142.

{
  "avisos": [
    { "tipo": "vencimiento", "poliza": "POL-88219-CO", "venceEn": "2027-03-12" },
    { "tipo": "renovacion", "poliza": "POL-88219-CO", "estado": "vigente" }
  ]
}

HU-136 · Renovar, modificar, cancelar

{ "numero": "POL-88219-CO", "verbo": "renovar" }

verbo es renovar, modificar o cancelar. Cancelar exige motivo:

{ "numero": "POL-88219-CO", "verbo": "cancelar", "motivo": "El cliente lo pidió" }

La respuesta es el objeto de póliza de HU-127 con el estado nuevo.

HU-137 · Inicio móvil

Un solo agregado. Cada bloque trae ramo, estado y el siguiente paso.

{
  "ofertaVigente": {
    "cotizacionId": "COT-1042",
    "ramo": "Protección de dispositivo",
    "estado": "oferta_vigente"
  },
  "poliza": {
    "numero": "POL-88219-CO",
    "ramo": "Protección de dispositivo",
    "estado": "vigente"
  },
  "siniestroEnCurso": {
    "siniestroId": "SIN-441",
    "estado": "en_evaluacion"
  },
  "hipotecario": null
}

HU-138 · Inicio web

El mismo agregado de HU-137, con el payload de escritorio (tablas, no cards de 390).

HU-139 · Cartera del asesor

{
  "kpis": { "cotizaciones": 12, "polizas": 40 },
  "cola": [
    { "id": "COT-1042", "tipo": "cotizacion", "ramo": "Protección de dispositivo", "estado": "en_revision" },
    { "id": "POL-88219-CO", "tipo": "poliza", "ramo": "Protección de dispositivo", "estado": "vigente" }
  ]
}

HU-140 · Ficha de clientes

{
  "clientes": [
    {
      "clienteId": "CLI-18",
      "nombre": "Camila Restrepo",
      "documento": "1012345678",
      "correo": "[email protected]",
      "habeasData": true,
      "estado": "activo"
    }
  ]
}

Alta y edición usan ese objeto sin clienteId. Desactivar:

{ "clienteId": "CLI-18", "estado": "inactivo" }

HU-141 es la pantalla de esa ficha, no un contrato.

HU-142 · Token y avisos push

La bandeja es del sistema. El BFF registra el token y nombra la pantalla que se abre.

{ "token": "fcm-stub", "plataforma": "android" }
{
  "tipo": "vencimiento",
  "titulo": "Tu póliza vence",
  "cuerpo": "En 7 días",
  "destino": "aviso-vencimiento",
  "poliza": "POL-88219-CO"
}

tipo es pago_automatico, vencimiento, renovacion o estado_siniestro. destino es parametrico, aviso-vencimiento, aviso-renovacion o detalle-siniestro. El proveedor de push es un stub.

HU-143 · Prestadores y asistencia

{
  "prestadores": [
    { "id": "PR-1", "nombre": "Taller Norte", "distanciaKm": 1.2, "zona": "Chapinero" },
    { "id": "PR-2", "nombre": "Taller Sur", "distanciaKm": 3.4, "zona": "Kennedy" }
  ]
}
{
  "prestadorId": "PR-1",
  "geo": { "lat": 4.6533, "lng": -74.0836 },
  "poliza": "POL-88219-CO"
}
{ "asistenciaId": "AS-18", "estado": "registrada" }

Operaciones lee { "asistenciaId", "prestadorId", "poliza", "estado" }. No entra en la cola de HU-130.