Saltar a contenido

🎯 Anatomía del MVP Backlog — Flujo Encuesta de Satisfacción Post-Consulta

Fecha: 1 de abril de 2026 Propósito: Diseño exhaustivo nodo-por-nodo del flujo MVP Backlog que demuestra el valor completo de Pet Flows Estado: Este flujo es 100% vigente según el usuario


1. La Historia de Usuario (Textual)

"Crearemos un flujo permanente, que detecta cierres de casos y planifica mandarle dentro de 5 días al usuario una notificación push (que incluye un deeplink) para que abra la app de QC+ y rellene una encuesta de satisfacción"


2. El Flujo Visual

graph LR
    T["⚡ TRIGGER<br/>Caso cerrado<br/>App: DKV PET<br/>Cola: Telemedicina"] 
    --> F["🔍 FILTRO<br/>(en edge)<br/>queue = Telemedicina<br/>status = closed"]
    --> W["⏱️ ESPERA<br/>5 días<br/>App: Flow Control<br/>Módulo: Sleep"]
    --> C["🔍 CONDICIÓN<br/>¿Push habilitado?<br/>user.push_enabled"]

    C -->|"Sí"| P["📲 PUSH<br/>Enviar push<br/>App: Notificaciones<br/>Deep link encuesta"]
    C -->|"No"| E["✉️ EMAIL<br/>Enviar email<br/>App: Notificaciones<br/>Link encuesta"]

    P --> LOG["📊 REGISTRO<br/>Log evento<br/>App: Datos<br/>analytics_event"]
    E --> LOG

    style T fill:#7C3AED,color:#fff
    style F fill:#D97706,color:#fff
    style W fill:#6366f1,color:#fff
    style C fill:#D97706,color:#fff
    style P fill:#059669,color:#fff
    style E fill:#059669,color:#fff
    style LOG fill:#2563EB,color:#fff

3. Nodo por Nodo — Configuración Completa

Nodo 1: ⚡ Trigger — Caso Cerrado

Campo Valor
App 🐾 DKV PET
Módulo pet-case-closed — Caso cerrado
Tipo trigger instant-trigger (webhook)
Modo Always-on (permanente)
Cola configurada Telemedicina (seleccionable de dropdown)

Fuente técnica: PET publica un webhook cuando un caso se cierra en la cola. El campo webhook_new_message_recipients en la entidad Queue de dkv-pet-admin apunta a la URL de ingress de Pet Flows.

Payload que recibe (desde PET):

{
  "event": "encounter_closed",
  "queue_id": "queue-telemedicina-001",
  "queue_name": "Telemedicina General",
  "encounter": {
    "id": "enc-2026-04-001",
    "patient_id": "user-12345",
    "patient_name": "María García",
    "pet_id": "pet-67890",
    "pet_name": "Luna",
    "pet_species": "dog",
    "vet_id": "vet-555",
    "vet_name": "Dr. López",
    "created_at": "2026-04-01T10:00:00Z",
    "closed_at": "2026-04-01T10:45:00Z",
    "reason": "Consulta dermatológica",
    "diagnosis": "Dermatitis atópica leve",
    "resolution": "Tratamiento prescrito"
  },
  "user": {
    "id": "user-12345",
    "name": "María García",
    "email": "maria.garcia@example.com",
    "push_enabled": true,
    "push_token": "fcm:abc123...",
    "app_platform": "ios",
    "locale": "es-ES",
    "tags": ["premium", "dog-owner", "madrid"]
  }
}

Nodo 2: ⏱️ Espera — 5 Días

Campo Valor
App 🔧 Flow Control
Módulo fc-sleep — Espera
Duración 5 días
Unidad days

Backend: Dapr Timer — ctx.createTimer(Duration.ofDays(5)).await()

[!IMPORTANT] Este nodo es crítico para la durabilidad. Si el servidor se reinicia durante los 5 días, Dapr Workflows reanuda automáticamente desde este checkpoint. No se pierden flujos en progreso.

Nodo 3: 🔍 Condición — ¿Push Habilitado?

Campo Valor
App (inline, nodo lógico del Router)
Regla context.user.push_enabled == true
Rama Sí → Nodo Push
Rama No → Nodo Email

Nodo 4a: 📲 Push — Enviar Notificación

Campo Valor
App 📲 Notificaciones
Módulo notify-push-rich — Push enriquecido
Título "¡Hola {{user.name}}! ¿Cómo fue la consulta de {{pet.name}}?"
Cuerpo "Cuéntanos tu experiencia con {{vet.name}}. Solo 2 minutos."
Deep Link qcplus://survey/satisfaction?encounter={{encounter.id}}
Imagen URL del logo DKV o imagen de la mascota
Botón acción "Responder encuesta" → deep link

Payload Gorush:

{
  "notifications": [{
    "tokens": ["fcm:abc123..."],
    "platform": 2,
    "title": "¡Hola María! ¿Cómo fue la consulta de Luna?",
    "message": "Cuéntanos tu experiencia con Dr. López. Solo 2 minutos.",
    "data": {
      "deep_link": "qcplus://survey/satisfaction?encounter=enc-2026-04-001",
      "type": "satisfaction_survey"
    },
    "mutable_content": true,
    "image": "https://cdn.dkv.es/pet/survey-header.png"
  }]
}

Nodo 4b: ✉️ Email — Alternativa

Campo Valor
App 📲 Notificaciones
Módulo notify-email — Enviar Email
Para {{user.email}}
Asunto "{{user.name}}, ¿cómo fue la consulta de {{pet.name}}?"
Template satisfaction_survey_email
Variables user, pet, vet, encounter

Nodo 5: 📊 Registro — Log Analítico

Campo Valor
App 🗄️ Datos
Módulo data-variable / log evento
Evento survey_sent
Datos encounter_id, channel (push

4. Serialización JSON del Flujo (FlowData)

{
  "id": "flow-satisfaction-survey-v1",
  "version": "1.0.0",
  "name": "Encuesta de satisfacción post-consulta",
  "status": "active",
  "triggerMode": "always-on",
  "nodes": [
    {
      "id": "trigger-1",
      "type": "trigger",
      "position": { "x": 100, "y": 300 },
      "data": {
        "label": "Caso cerrado",
        "moduleType": "instant-trigger",
        "icon": "stethoscope",
        "color": "#009BE0",
        "configValues": {
          "app": "dkv-pet",
          "module": "pet-case-closed",
          "queue_filter": "telemedicina"
        }
      }
    },
    {
      "id": "wait-1",
      "type": "module",
      "position": { "x": 350, "y": 300 },
      "data": {
        "label": "Esperar 5 días",
        "moduleType": "action",
        "icon": "clock",
        "color": "#10b981",
        "configValues": {
          "app": "flow-control",
          "module": "fc-sleep",
          "duration": 5,
          "unit": "days"
        }
      }
    },
    {
      "id": "condition-1",
      "type": "router",
      "position": { "x": 600, "y": 300 },
      "data": {
        "label": "¿Push habilitado?",
        "moduleType": "router",
        "icon": "split",
        "color": "#10b981"
      }
    },
    {
      "id": "push-1",
      "type": "module",
      "position": { "x": 850, "y": 200 },
      "data": {
        "label": "Enviar push",
        "moduleType": "action",
        "icon": "bell",
        "color": "#059669",
        "configValues": {
          "app": "notifications",
          "module": "notify-push-rich",
          "title": "¡Hola {{user.name}}! ¿Cómo fue la consulta de {{pet.name}}?",
          "body": "Cuéntanos tu experiencia con {{vet.name}}. Solo 2 minutos.",
          "deep_link": "qcplus://survey/satisfaction?encounter={{encounter.id}}"
        }
      }
    },
    {
      "id": "email-1",
      "type": "module",
      "position": { "x": 850, "y": 400 },
      "data": {
        "label": "Enviar email",
        "moduleType": "action",
        "icon": "mail",
        "color": "#059669",
        "configValues": {
          "app": "notifications",
          "module": "notify-email",
          "to": "{{user.email}}",
          "subject": "{{user.name}}, ¿cómo fue la consulta de {{pet.name}}?",
          "template": "satisfaction_survey_email"
        }
      }
    },
    {
      "id": "log-1",
      "type": "module",
      "position": { "x": 1100, "y": 300 },
      "data": {
        "label": "Registrar envío",
        "moduleType": "action",
        "icon": "bar-chart",
        "color": "#2563EB",
        "configValues": {
          "app": "data",
          "module": "data-variable",
          "event": "survey_sent"
        }
      }
    }
  ],
  "edges": [
    { "id": "e1", "source": "trigger-1", "target": "wait-1", "type": "animated-edge" },
    { "id": "e2", "source": "wait-1", "target": "condition-1", "type": "animated-edge" },
    { 
      "id": "e3", "source": "condition-1", "target": "push-1", "type": "animated-edge",
      "data": { "label": "Push ON", "filter": { "rules": [{ "operand1": "user.push_enabled", "operator": "==", "operand2": "true" }] } }
    },
    { 
      "id": "e4", "source": "condition-1", "target": "email-1", "type": "animated-edge",
      "data": { "label": "Push OFF", "isFallback": true }
    },
    { "id": "e5", "source": "push-1", "target": "log-1", "type": "animated-edge" },
    { "id": "e6", "source": "email-1", "target": "log-1", "type": "animated-edge" }
  ],
  "metadata": {
    "createdAt": "2026-04-01T14:00:00Z",
    "createdBy": "admin",
    "domainPack": "pet-health",
    "description": "Flujo permanente: detecta cierres de caso en cola de telemedicina, espera 5 días, envía push/email con deep link a encuesta de satisfacción en QC+"
  }
}

5. Segundo Flujo MVP Backlog — Tiempo de Respuesta en Cola (Nuevo Requisito)

El usuario menciona un nuevo requisito: "el primer cambio que nos han pedido se puede hacer con unos ajustes añadiendo una nueva configuración de tiempo de respuesta (parecida) en la configuración de la cola".

graph LR
    T["⚡ TRIGGER<br/>SLA excedido<br/>Cola: Urgencias<br/>Timeout: 30min"]
    --> GET["🔍 BUSCAR<br/>Obtener datos<br/>del caso y usuario"]
    --> PUSH["📲 PUSH<br/>Alerta al equipo<br/>médico de guardia"]
    --> ESCALAR["📊 REGISTRAR<br/>Evento de<br/>escalado"]

    style T fill:#7C3AED,color:#fff
    style GET fill:#2563EB,color:#fff
    style PUSH fill:#059669,color:#fff
    style ESCALAR fill:#2563EB,color:#fff
Campo Valor
Trigger pet-queue-timeout — Tiempo de respuesta excedido
Cola Urgencias
SLA configurado 30 minutos
Acción Push al equipo médico de guardia + registro de escalado

[!TIP] Este flujo demuestra que Pet Flows puede gestionar SLAs operativos además de engagement marketing. El mismo motor de flujos sirve para ambos casos — lo cual multiplica el valor del producto para DKV.


6. ¿Qué se necesita implementar para que el MVP Backlog funcione?

Backend (dkv-pet-flows-api)

Componente Story SP Prioridad
Webhook ingress endpoint POST /api/webhooks/pet que recibe payloads de PET 3 Must
Flow execution engine Dapr Workflow que interpreta el flow JSON 13 Must
Wait/Timer activity ctx.createTimer() para la espera de 5 días 3 Must
Condition evaluator Evaluar user.push_enabled == true 3 Must
Gorush push activity HTTP POST a Gorush con payload rich 5 Must
Email activity Dapr Binding SMTP 3 Should
Total MVP Backlog backend 30 SP

Frontend (dkv-pet-flows-admin + Jaraxa)

Componente Story SP Prioridad
Reemplazar mock apps por 5 apps DKV Datos estáticos, no API 3 Must
Trigger config panel (cola + evento) Post-selección del trigger 8 Must
Sleep config panel (duración) Formulario simple 2 Must
Push config panel (título, body, deep link) Template con variables 5 Must
Visualización del flujo en canvas Ya funciona con Jaraxa 0 Done
Total MVP Backlog frontend 18 SP

Integración PET

Componente Story SP Prioridad
Configurar webhook_new_message_recipients en cola Telemedicina Config en dkv-pet-admin 1 Must
Verificar payload del webhook Spike: interceptar y documentar 2 Must
Total integración 3 SP

TOTAL MVP Backlog: ~51 SP ≈ 3-4 semanas con 1 desarrollador


Documentos Relacionados

Documento Propósito
01 — Mapa de Piezas Vista general del ecosistema
03 — PET como App Las 5 apps reales
05 — Direcciones Estratégicas Qué construir primero