bloque 4: campanas por segmentos con medicion (modulo skeen_campanas: segmentos reutilizables con conteo verificado, campanas por WhatsApp y correo con programacion, prueba previa, limite por minuto, pausa por errores, consentimiento por canal y atribucion de citas) + encuesta al salir con NPS (campo propio, envio automatico y recordatorio, reporte con tendencia y desglose); apagado por defecto

This commit is contained in:
2026-10-12 02:34:34 +00:00
parent 705b5a2842
commit a6d6df4ebd
37 changed files with 4619 additions and 44 deletions

View File

@@ -503,10 +503,12 @@ formularios.
requerir firma y/o foto, duración estimada y asociación opcional a sucursales
y servicios. Las plantillas se **versionan**: cada respuesta guarda la versión
con la que se llenó.
- **Tipos de campo** (12): texto, texto largo, número, fecha, selección,
multiselección, casilla, escala, firma, foto, archivo y consentimiento. Los
campos de foto/archivo pueden marcarse como antes / después / otro, lo que
arma la **galería antes/después** del expediente.
- **Tipos de campo** (13): texto, texto largo, número, fecha, selección,
multiselección, casilla, escala, **recomendación (NPS 0-10)**, firma, foto,
archivo y consentimiento. Los campos de foto/archivo pueden marcarse como
antes / después / otro, lo que arma la **galería antes/después** del
expediente. El campo de recomendación (NPS) es un tipo propio: se puede
analizar sin depender del texto (ver la sección de encuestas de salida).
- **Envío**: por WhatsApp, correo o enlace. El enlace es un token firmado (HMAC,
vigencia 180 días) y deja de servir al llenarse.
- **Llenado por el paciente**: página pública `/formulario/<token>` (también
@@ -515,6 +517,104 @@ formularios.
y fotos requeridas.
- **Historial**: respuestas por paciente con canal, fecha, firma y fotos.
## 14 bis. Campañas por segmentos — apagado por defecto
**Configuración → Campañas** (interruptor) y **Campañas** (menú, sección
"Comunicación"), con dos pestañas: **Campañas** y **Segmentos**. Con el bloque
apagado (`campanas.activo = false`, el default) no aparece ninguna pantalla ni
enlace, no corre ningún proceso automático y no se envía nada.
- **Segmentos** (`skeen.segmento`): un segmento guarda nombre, criterios y una
**previsualización** (cuántos pacientes y una muestra de 5) que se calcula
*antes* de usarlo. Criterios disponibles (todos opcionales):
- última visita hace más de N días, o sin visita en N meses (incluye a quien
nunca ha venido);
- cumpleaños del mes en curso o en los próximos N días;
- nivel de lealtad;
- gasto acumulado (suma de ventas no canceladas) mayor o igual a X;
- sucursal (con al menos una cita ahí);
- servicio que **sí** ha tomado y servicio que **nunca** ha tomado;
- con o sin membresía activa;
- con o sin paquetes con sesiones disponibles;
- con o sin saldo pendiente;
- con o sin consentimiento de marketing.
La evaluación corre en el servidor y su conteo coincide con lo que responde
la base de datos.
- **Campañas** (`skeen.campana`): nombre, segmento, canal (WhatsApp, correo o
ambos), mensaje con variables (`{nombre}`, `{servicio}`, `{sucursal}`,
`{enlace}`, `{doctor}`, `{fecha}`, `{hora}`, `{telefono}`), programación
(una sola vez en una fecha, mensual, semanal o **según el propio segmento**,
p. ej. cumpleaños) y estado (borrador, programada, en ejecución, pausada,
terminada, cancelada).
- **Envío de prueba**: manda el mensaje a un número o correo propio antes de
lanzar. Queda registrado en la bitácora marcado como prueba (no cuenta en la
medición).
- **Medición por campaña**: pacientes alcanzados, enviados, errores y
pendientes; **citas generadas como consecuencia** (atribuidas por paciente y
dentro de una **ventana configurable**, por defecto 7 días) y su valor en
dinero; y la tasa de conversión. Lo que no se puede medir con lo que hay
(entrega real y respuestas del paciente) se muestra como **no disponible** en
lugar de inventarse.
- **Cuidado de WhatsApp**: **límite de envíos por minuto** configurable,
**pausa automática** si se acumulan errores seguidos y **respeto al
consentimiento** (ver abajo).
- **Opciones del bloque** (defaults): `activo` (no), `envios_por_minuto` (20),
`pausar_tras_errores` (5), `ventana_atribucion_dias` (7),
`exigir_consentimiento` (sí) y `hora_envio` (`10:00`, para las recurrentes).
### 14 bis.1 Consentimiento de marketing por canal
En el paciente (`res.partner`) hay un interruptor **general** y uno por canal:
- `consentimiento_marketing` (general), `consentimiento_whatsapp` y
`consentimiento_email`, más la fecha y el origen del consentimiento.
Un paciente **sin consentimiento de marketing nunca recibe una campaña**, aunque
cumpla el criterio del segmento. Los **avisos transaccionales** (recordatorio de
cita, confirmación, encuesta de salida) **no dependen** de esto: son parte del
servicio que el paciente ya contrató. El consentimiento nace **apagado**.
### 14 bis.2 Permisos
- `campanas.ver`: ver campañas y segmentos (por defecto: todos los roles).
- `campanas.gestionar`: crear y editar campañas y segmentos (admin, gerencia y
marketing).
- `campanas.enviar`: lanzar campañas y enviar pruebas (admin, gerencia y
marketing).
- `campanas.medir`: ver la medición (por defecto: todos los roles).
## 14 ter. Encuestas de salida y satisfacción (NPS) — apagado por defecto
**Configuración → Encuestas** (interruptor) y **Satisfacción** (menú). Con el
bloque apagado (`encuestas.activo = false`, el default) no se envía ninguna
encuesta tras completar una cita y la pantalla de Satisfacción no aparece.
- **Envío automático**: cuando una cita pasa a completada, tras **N horas**
(default 2) se envía al paciente la encuesta configurada, por WhatsApp, correo
o ambos. Hay **recordatorio opcional** si no responde (default 48 h) y una
opción de **enviarla solo a la primera visita**.
- **Captura**: reutiliza la página pública de formularios `/formulario/<token>`
(no hay otro mecanismo de captura). El mensaje de agradecimiento es
configurable.
- **Pregunta de recomendación (NPS)**: tipo de campo propio `nps` (puntaje de 0 a
10) más un comentario abierto (texto largo). Se calcula de forma estándar:
**promotores 9-10**, pasivos 7-8, **detractores 0-6**, y
**NPS = % promotores − % detractores** (de −100 a 100).
- **Reporte de satisfacción**: resultado del periodo, **tendencia por mes**,
desglose por **sucursal, médico y servicio**, y la lista de respuestas con su
comentario y un enlace a la ficha del paciente para dar seguimiento (incluida
la posibilidad de **responderle por WhatsApp** desde ahí). Exportable a Excel.
- **Opciones del bloque** (defaults): `activo` (no), `enviar_tras_horas` (2),
`plantilla_id` (ninguna), `canal` (`whatsapp`), `recordatorio_horas` (48),
`solo_primera_visita` (no) y `agradecimiento` (vacío).
- **Permisos**: `encuestas.ver` y `encuestas.medir` (todos los roles);
`encuestas.gestionar` (admin y gerencia).
Ambas piezas **pasan por el motor de notificaciones**: nada se envía en silencio,
todo respeta el **modo prueba** y queda en la bitácora con su campaña o encuesta
de origen.
## 15. Tickets y documentos
**Configuración → Tickets**: ancho (58/80 mm), fuente, logo y qué secciones se
@@ -600,6 +700,9 @@ El panel es una **aplicación web instalable** (PWA), sin tienda de aplicaciones
- [ ] Compras y proveedores (si controla abasto y margen).
- [ ] Comisiones (reglas, metas y liquidaciones).
- [ ] Formularios y consentimientos.
- [ ] Campañas por segmentos (si hará marketing): activar y registrar el
consentimiento de los pacientes.
- [ ] Encuestas de salida: crear la plantilla con la pregunta NPS y activar.
- [ ] Reservas en línea (activar y difundir el enlace).
- [ ] Portal del cliente (si se ofrece cuenta): activar y difundir `/mi-cuenta`.
- [ ] Notificaciones en modo prueba → revisar textos → encender.
@@ -628,6 +731,8 @@ Todas las fases están **entregadas**.
| 3.5 | Licenciamiento por plan, API keys gestionables y webhooks | Entregado |
| 3.6 | i18n español/inglés | Entregado |
| 3.7 | Cuenta del cliente (portal de autoservicio) | Entregado |
| 3.8 | Campañas por segmentos con medición y consentimiento de marketing | Entregado |
| 3.9 | Encuestas de salida y satisfacción (NPS) | Entregado |
| Operación | Backups automáticos verificados y panel/CLI multi-instancia | Entregado |
Los pendientes y limitaciones conocidos (los que aún no están cerrados) viven en