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

@@ -24,6 +24,8 @@ import ComprasPanel from '../components/ComprasPanel';
import ComisionesPanel from '../components/ComisionesPanel';
import LealtadPanel from '../components/LealtadPanel';
import PropinasPanel from '../components/PropinasPanel';
import CampanasPanel from '../components/CampanasPanel';
import EncuestasPanel from '../components/EncuestasPanel';
import LicenciaPanel from '../components/LicenciaPanel';
import ApiKeysPanel from '../components/ApiKeysPanel';
import WebhooksPanel from '../components/WebhooksPanel';
@@ -49,6 +51,8 @@ const TABS = [
{ key: 'comisiones', label: 'Comisiones' },
{ key: 'lealtad', label: 'Lealtad' },
{ key: 'propinas', label: 'Propinas' },
{ key: 'campanas', label: 'Campañas' },
{ key: 'encuestas', label: 'Encuestas' },
{ key: 'terminologia', label: 'Terminología' },
{ key: 'usuarios', label: 'Usuarios' },
{ key: 'roles', label: 'Roles' },
@@ -62,7 +66,7 @@ const TABS = [
] as const;
// Secciones que ve gerencia (admin del sistema ve todas).
const TABS_GERENCIA = ['reservas', 'portal', 'notificaciones', 'notif_enviadas', 'formularios', 'sucursales', 'categorias', 'recursos', 'membresias', 'compras', 'comisiones', 'lealtad', 'propinas', 'terminologia', 'usuarios', 'roles', 'tickets', 'licencia', 'webhooks'];
const TABS_GERENCIA = ['reservas', 'portal', 'notificaciones', 'notif_enviadas', 'formularios', 'sucursales', 'categorias', 'recursos', 'membresias', 'compras', 'comisiones', 'lealtad', 'propinas', 'campanas', 'encuestas', 'terminologia', 'usuarios', 'roles', 'tickets', 'licencia', 'webhooks'];
const SUBCATALOGOS = [
{ key: 'diagnosticos', label: 'Diagnósticos' },
@@ -94,6 +98,8 @@ const Configuracion: FC = () => {
comisiones: 'comisiones.editar',
lealtad: 'lealtad.configurar',
propinas: 'propinas.configurar',
campanas: 'campanas.gestionar',
encuestas: 'encuestas.gestionar',
recursos: 'recursos.editar',
licencia: 'config.editar',
api: 'api.claves',
@@ -458,6 +464,18 @@ const Configuracion: FC = () => {
<PropinasPanel settings={settings} onSaved={setSettings} />
</Card.Body>
</Card>
) : tab === 'campanas' ? (
<Card>
<Card.Body>
<CampanasPanel settings={settings} onSaved={setSettings} />
</Card.Body>
</Card>
) : tab === 'encuestas' ? (
<Card>
<Card.Body>
<EncuestasPanel settings={settings} onSaved={setSettings} />
</Card.Body>
</Card>
) : tab === 'terminologia' ? (
<Card>
<Card.Body>