🐾 PET como App — Cómo Exponer Objetos de Negocio en el Flow Builder¶
Fecha: 1 de abril de 2026 Propósito: Diseñar qué "Apps" reales aparecen en el AppSelectorDialog de Jaraxa cuando se usa desde dkv-pet-flows Premisa: El AppSelectorDialog actual tiene sus apps no-Flow-Control como mockups (Gmail, Slack, etc.). Son placeholder conceptual. Este documento define qué va en su lugar.
1. El Problema¶
El AppSelectorDialog de Jaraxa muestra apps al estilo Make.com: Gmail, Google Sheets, Slack, OpenAI... Pero dkv-pet-flows no se integra con Gmail ni Slack. Se integra con:
- dkv-pet-cloud (fuente de verdad de negocio)
- Gorush (push notifications)
- SMTP/SendGrid (email)
- Y potencialmente con sistemas DKV futuros
La pregunta es: ¿cómo organizo los objetos de negocio de PET en el concepto de "App" del selector?
2. Las 5 Apps Reales de DKV Pet Flows¶
graph LR
subgraph "AppSelectorDialog"
PET["🐾 DKV PET<br/>Datos de negocio"]
NOTIFY["📲 Notificaciones<br/>Canales de salida"]
FC["🔧 Flow Control<br/>Lógica del flujo"]
DATA["🗄️ Datos<br/>Consultas y variables"]
AI["🤖 Inteligencia<br/>IA y personalización"]
end
style PET fill:#009BE0,color:#fff
style NOTIFY fill:#059669,color:#fff
style FC fill:#10b981,color:#fff
style DATA fill:#2563EB,color:#fff
style AI fill:#DB2777,color:#fff
[!IMPORTANT] Estas 5 apps reemplazan los 9 mockups actuales (Google Sheets, Airtable, Gmail, Slack, OpenAI, HTTP, Webhooks, Tools, Flow Control). Solo Flow Control se mantiene tal cual.
3. App 1 — 🐾 DKV PET (Fuente de Datos)¶
Esta es la app más importante. Expone los objetos de negocio de dkv-pet-cloud como triggers y acciones.
Objetos de Negocio de PET¶
| Objeto PET | Descripción | Rol en Flows |
|---|---|---|
| Queue (Cola) | Cola de atención (Telemedicina, Urgencias, Nutrición...) | 🔴 Trigger principal |
| Encounter (Caso) | Caso médico (videollamada/chat) | Datos del evento |
| User | Usuario de la app QC+ | Destinatario |
| Pet (Mascota) | Mascota del usuario | Datos de contexto |
| Policy (Póliza) | Póliza de seguro | Datos de segmentación |
Módulos de la App "DKV PET"¶
| ID | Módulo | Tipo | Descripción | Datos que produce |
|---|---|---|---|---|
pet-case-closed |
Caso cerrado | trigger |
Se dispara cuando un caso/encounter se cierra en una cola | encounter_id, queue_id, patient_id, pet_id, vet_id, closed_at, diagnosis, queue_name |
pet-case-created |
Nuevo caso | trigger |
Se dispara cuando se abre un nuevo caso | encounter_id, queue_id, patient_id, reason |
pet-queue-timeout |
Tiempo de respuesta excedido | trigger |
Se dispara cuando un caso supera el SLA de respuesta configurado en la cola | encounter_id, queue_id, elapsed_time, sla_limit |
pet-user-inactive |
Usuario inactivo | trigger |
Se dispara periódicamente para usuarios sin actividad en N días | user_id, last_active_at, days_inactive |
pet-pet-birthday |
Cumpleaños de mascota | trigger |
Se dispara en el cumpleaños de la mascota | pet_id, pet_name, user_id, age |
pet-policy-change |
Cambio de póliza | trigger |
Alta, baja, o renovación de póliza | policy_id, user_id, change_type, effective_date |
pet-vaccine-reminder |
Recordatorio de vacuna | trigger |
Próxima vacuna programada en N días | pet_id, vaccine_name, due_date |
pet-get-user |
Obtener usuario | search |
Busca datos completos del usuario | user_id → name, email, phone, push_token, tags |
pet-get-pet |
Obtener mascota | search |
Busca datos de la mascota | pet_id → name, species, breed, birthdate, vaccines |
pet-update-tags |
Actualizar tags | action |
Modifica tags del usuario en tiempo real (sin deploy de app) | Input: user_id, tags_to_add, tags_to_remove |
pet-update-profile |
Actualizar perfil | action |
Modifica datos del usuario/mascota | Input: user_id, campos a modificar |
La Cola como Puente Natural 🔑¶
[!IMPORTANT] La Cola (
Queue) de PET es el concepto puente perfecto entre PET y Flows. Cada cola ya tiene un campowebhook_new_message_recipientsque envía webhooks cuando ocurre actividad. Esto convierte cada cola en un canal de eventos natural.
dkv-pet-cloud dkv-pet-flows
┌──────────────────────┐ ┌──────────────────────┐
│ Queue: Telemedicina │ │ Trigger: Caso cerrado│
│ ├─ webhook_url ──────┼────── HTTP POST ───►│ ├─ Cola: Telemedicina│
│ ├─ sla_response: 2h │ │ ├─ Filtro: ... │
│ └─ sla_resolution:24h│ │ └─ Payload: {...} │
│ │ │ │
│ Queue: Urgencias │ │ Trigger: SLA excedido │
│ ├─ webhook_url ──────┼────── HTTP POST ───►│ ├─ Cola: Urgencias │
│ └─ sla_response: 30m │ │ └─ Timeout: 30m │
└──────────────────────┘ └──────────────────────┘
Cambio de requisito mencionado por el usuario: El primer cambio que 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". Esto confirma que la Cola es la entidad central de integración.
4. App 2 — 📲 Notificaciones (Canales de Salida)¶
Esta app agrupa todos los canales de comunicación con el usuario final.
| ID | Módulo | Tipo | Descripción | Backend |
|---|---|---|---|---|
notify-push |
Enviar Push | action |
Push notification iOS/Android con rich content, deep links | Gorush → APNs + FCM |
notify-push-rich |
Push enriquecido | action |
Push con imagen, botones de acción, deep link | Gorush (rich payload) |
notify-email |
Enviar Email | action |
Email con template personalizado | Dapr Binding → SMTP/SendGrid |
notify-sms |
Enviar SMS | action |
SMS transaccional | Dapr Binding → Twilio/Vonage |
notify-in-app |
Mensaje In-App | action |
Mensaje mostrado al abrir la app | WebSocket/SSE → QC+ App |
notify-inbox |
Buzón In-App | action |
Mensaje persistente en buzón del usuario | PostgreSQL + API |
[!TIP] Notificare replacement: Esta app es el reemplazo funcional directo de Notificare. Cada módulo aquí equivale a lo que Notificare hacía, pero con la ventaja de que los tags se pueden modificar en tiempo real (módulo
pet-update-tags) sin publicar nueva versión de la app.
5. App 3 — 🔧 Flow Control (Lógica)¶
Ya existe en Jaraxa. Se mantiene tal cual con estos módulos:
| ID | Módulo | Tipo | Descripción |
|---|---|---|---|
fc-router |
Router | action |
Bifurcación condicional N ramas |
fc-iterator |
Iterator | action |
Itera sobre array de elementos |
fc-aggregator |
Aggregator | action |
Combina resultados |
fc-sleep |
Espera | action |
Delay temporal (minutos, horas, días) |
fc-wait-event |
Esperar evento | action |
Pausa hasta que ocurra evento o timeout |
fc-rate-limiter |
Rate Limiter | action |
Control de velocidad de envío |
fc-error-handler |
Error Handler | action |
Captura errores y redirige |
fc-ab-split |
A/B Test | action |
Split porcentual (60/40, 50/50, etc.) |
6. App 4 — 🗄️ Datos & Consultas¶
| ID | Módulo | Tipo | Descripción |
|---|---|---|---|
data-query |
Consulta BD | search |
Query a PostgreSQL o PET API |
data-transform |
Transformar | action |
Mapear, filtrar o reestructurar datos |
data-variable |
Variable | action |
Set/Get variables del flow |
data-template |
Template | action |
Renderizar template con datos del contexto |
data-http |
HTTP Request | action |
Llamada a API externa genérica |
data-webhook-out |
Webhook saliente | action |
POST a sistema externo |
7. App 5 — 🤖 Inteligencia (IA)¶
| ID | Módulo | Tipo | Descripción | Backend |
|---|---|---|---|---|
ai-generate |
Generar contenido | action |
Personaliza mensaje con LLM | LangChain4j → Azure OpenAI |
ai-best-time |
Mejor hora de envío | action |
Calcula hora óptima para el usuario | ML model |
ai-sentiment |
Análisis sentimiento | action |
Analiza respuesta de encuesta | LangChain4j |
ai-classify |
Clasificar | action |
Clasifica tipo de consulta, urgencia | LangChain4j |
ai-recommend |
Recomendar | action |
Sugiere acción basada en historial | Recommendation engine |
8. Visualización Completa del AppSelectorDialog (DKV)¶
┌─────────────────────────────────────────────────────────────────────┐
│ 🔍 Buscar apps o módulos... │ 📋 All apps│
│ ───────────────────────────────────────────────────────────────── │
│ │ ⭐ Featured│
│ Apps en este escenario │ 🔧 Built-in│
│ │ ⚡ Triggers│
│ ┌─────────────────────────────────────────────────┐ │ 🤖 IA │
│ │ 🐾 DKV PET › │ │ │
│ │ Casos, colas, usuarios, mascotas, pólizas │ │ │
│ ├─────────────────────────────────────────────────┤ │ │
│ │ 📲 Notificaciones › │ │ │
│ │ Push, email, SMS, in-app, buzón │ │ │
│ ├─────────────────────────────────────────────────┤ │ │
│ │ 🔧 Flow Control › │ │ │
│ │ Router, espera, iterador, A/B test │ │ │
│ ├─────────────────────────────────────────────────┤ │ │
│ │ 🗄️ Datos › │ │ │
│ │ Queries, variables, templates, HTTP │ │ │
│ ├─────────────────────────────────────────────────┤ │ │
│ │ 🤖 Inteligencia › │ │ │
│ │ Generar contenido, sentimiento, timing │ │ │
│ └─────────────────────────────────────────────────┘ │ │
│ │ 💬 Feedback│
└─────────────────────────────────────────────────────────────────────┘
Vista de módulos de "DKV PET" (drill-down)¶
┌─────────────────────────────────────────────────────────────────────┐
│ ‹ 🐾 DKV PET │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ TRIGGERS │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ⚡ Caso cerrado TRIGGER │ │
│ │ Se dispara cuando un caso se cierra en una cola │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ ⚡ Nuevo caso TRIGGER │ │
│ │ Se dispara cuando se abre un nuevo caso │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ ⏰ Tiempo de respuesta excedido TRIGGER │ │
│ │ Se dispara cuando un caso supera el SLA │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 😴 Usuario inactivo TRIGGER │ │
│ │ Usuarios sin actividad en los últimos N días │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 🎂 Cumpleaños de mascota TRIGGER │ │
│ │ 💉 Recordatorio de vacuna TRIGGER │ │
│ │ 📋 Cambio de póliza TRIGGER │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ BÚSQUEDA │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🔍 Obtener usuario SEARCH │ │
│ │ 🔍 Obtener mascota SEARCH │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ACCIONES │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🏷️ Actualizar tags ACTION │ │
│ │ 👤 Actualizar perfil ACTION │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
9. De Mockup a Realidad — Plan de Implementación¶
| Paso | Descripción | Dónde |
|---|---|---|
| 1 | Mover MOCK_APPS → interfaz AppRegistry extensible |
@jaraxa/flow-canvas |
| 2 | Crear constante DKV_APPS con las 5 apps reales |
dkv-pet-flows-admin |
| 3 | El AppSelectorDialog recibe apps via prop o provider, no hardcodeado |
@jaraxa/flow-canvas |
| 4 | Crear endpoint GET /api/integrations que devuelve las apps dinámicamente |
dkv-pet-flows-api |
| 5 | Crear endpoint GET /api/pet/queues para listar colas disponibles de PET |
dkv-pet-flows-api |
| 6 | Post-selección de trigger PET → mostrar selector de cola + configuración | dkv-pet-flows-admin |
[!WARNING] El
fetchAppsAPIactual es un mock estático. Para el MVP Backlog, basta con reemplazar los datos mock por las 5 apps definidas aquí. La versión dinámica (endpoint real) puede esperar a Sprint 2.
Documentos Relacionados¶
| Documento | Propósito |
|---|---|
| 01 — Mapa de Piezas | Vista general del ecosistema |
| 02 — Tensión Conceptual | Make.com vs Customer Engagement |
| 04 — Anatomía del MVP Backlog | Flujo concreto de encuesta |
| 05 — Direcciones Estratégicas | Qué construir primero |