@php
$docs = [
[
'id' => 'entrada', 'icon' => 'π', 'color' => '#640028', 'titulo' => 'Entrada DID',
'desc' => 'Punto de inicio del flujo. Se crea automΓ‘ticamente uno por cada nΓΊmero DID contratado. No se puede eliminar ni mover a la papelera.',
'salidas' => [['ok', 'Primer elemento del flujo tras contestar la llamada']],
'campos' => [
['did', 'string', 'NΓΊmero DID completo con prefijo de paΓs (ej: 34919075252). Solo lectura.'],
['nombre', 'string', 'Nombre descriptivo del punto de entrada.'],
],
'ejemplos' => [
['Llamada entrante simple', 'Entrada DID β LocuciΓ³n bienvenida β IVR'],
['MΓΊltiples DIDs', 'DID 34919... β Flujo principal / DID 34910... β Flujo soporte'],
],
],
[
'id' => 'locucion', 'icon' => 'π', 'color' => '#0891b2', 'titulo' => 'LocuciΓ³n',
'desc' => 'Reproduce un fichero de audio. El caller escucha el audio completo y no puede interrumpirlo. El audio se puede subir, seleccionar de existentes o generar con TTS (Piper).',
'salidas' => [['ok', 'ContinΓΊa al siguiente elemento cuando termina el audio']],
'campos' => [
['nombre', 'string', 'Nombre descriptivo (ej: Bienvenida, Fuera de horario).'],
['audio', 'string', 'Ruta absoluta del fichero WAV en el servidor. Se puede elegir mediante los tabs: Subir archivo, Existente o TTS.'],
],
'ejemplos' => [
['Bienvenida', 'Entrada DID β LocuciΓ³n (gracias por llamar) β IVR'],
['Fuera de horario', 'Horario [fuera] β LocuciΓ³n (estamos cerrados) β Colgar'],
],
],
[
'id' => 'horario', 'icon' => 'π', 'color' => '#d97706', 'titulo' => 'Horario',
'desc' => 'EvalΓΊa si la llamada llega dentro del horario de atenciΓ³n. Soporta mΓΊltiples tramos por dΓa y festivos por mes.',
'salidas' => [
['dentro', 'La llamada llega en horario de atenciΓ³n'],
['fuera', 'La llamada llega fuera de horario'],
['festivo', 'La llamada llega en un dΓa festivo configurado (si no estΓ‘ conectado, cae a fuera)'],
],
'campos' => [
['tramos', 'array', 'Lista de tramos: { inicio, fin, dias }. DΓas disponibles: mon-fri, mon-sat, mon-sun, mon, tue, wed, thu, fri, sat, sun.'],
['festivos', 'array', 'Lista de festivos: { dias, mes }. Ej: dias=1-6, mes=jan para del 1 al 6 de enero.'],
],
'ejemplos' => [
['Oficina estΓ‘ndar', 'Horario L-V 9-18h β [dentro] IVR / [fuera] LocuciΓ³n + BuzΓ³n'],
['Turno partido', 'Horario L-V 8-14h + 16-19h β [dentro] Grupo / [fuera] DesvΓo mΓ³vil'],
],
],
[
'id' => 'ivr', 'icon' => 'ποΈ', 'color' => '#7c3aed', 'titulo' => 'IVR β MenΓΊ de opciones',
'desc' => 'Reproduce un audio de menΓΊ y espera que el caller pulse un dΓgito. Cada opciΓ³n configurada genera su propio puerto de salida en el nodo. El audio se puede subir, seleccionar o generar con TTS.',
'salidas' => [
['1..9', 'Una salida por cada dΓgito configurado en las opciones'],
['timeout', 'El caller no pulsΓ³ nada en el tiempo configurado'],
['invalido', 'El caller pulsΓ³ un dΓgito no definido en las opciones'],
],
'campos' => [
['nombre', 'string', 'Nombre del menΓΊ IVR.'],
['audio', 'string', 'Ruta del audio que anuncia las opciones. Configurable por tabs.'],
['timeout', 'nΓΊmero', 'Segundos de espera para recibir el dΓgito (defecto: 5).'],
['intentos', 'nΓΊmero', 'NΒΊ de intentos antes de ir a invΓ‘lido (defecto: 3).'],
['opciones', 'array', 'Lista de opciones: { digito, label }. El dΓgito define el nombre del puerto de salida.'],
],
'ejemplos' => [
['MenΓΊ 3 opciones', 'IVR [1]βVentas [2]βSoporte [3]βAdministraciΓ³n [timeout]βSoporte'],
['ConfirmaciΓ³n sΓ/no', 'IVR [1]βConfirmar cita [2]βCancelar [timeout]βColgar'],
],
],
[
'id' => 'grupo', 'icon' => 'π±', 'color' => '#16a34a', 'titulo' => 'Grupo de llamada',
'desc' => 'Llama a un grupo de extensiones SIP. Estrategia simultΓ‘nea (todas suenan a la vez) o secuencial (una a una en orden). Las extensiones se eligen con checkboxes.',
'salidas' => [
['contesta', 'Alguien del grupo descolgΓ³'],
['noresp', 'Nadie contestΓ³ en el tiempo configurado'],
['ocupado', 'Todas las extensiones estaban ocupadas'],
],
'campos' => [
['label', 'string', 'Nombre del grupo (ej: Comercial, Soporte).'],
['extensiones', 'array', 'Extensiones SIP seleccionadas. Se generan automΓ‘ticamente segΓΊn el rango del PBX.'],
['timeout', 'nΓΊmero', 'Segundos antes de considerar no respondida (defecto: 30).'],
['estrategia', 'enum', 'simultaneo: todas suenan a la vez. secuencial: una a una.'],
],
'ejemplos' => [
['Grupo con desborde a buzΓ³n', 'Grupo Comercial [noresp]β BuzΓ³n comercial'],
['Secuencial con desvΓo', 'Grupo soporte (secuencial) [noresp]β DesvΓo mΓ³vil guardia'],
],
],
[
'id' => 'cola', 'icon' => 'β³', 'color' => '#059669', 'titulo' => 'Cola de espera',
'desc' => 'Encola la llamada en Asterisk (app_queue). El panel genera automΓ‘ticamente el fichero de configuraciΓ³n de la cola al publicar. El nombre de la cola sigue el formato q{pbx/100}_{sufijo}.',
'salidas' => [
['contesta', 'Un agente de la cola descolgΓ³'],
['timeout', 'Se superΓ³ el tiempo mΓ‘ximo de espera en cola'],
],
'campos' => [
['nombre', 'string', 'Nombre descriptivo de la cola.'],
['cola', 'string', 'Sufijo del nombre en Asterisk. La cola resultante serΓ‘ q{pbx/100}_{sufijo} (ej: q99_soporte).'],
['timeout', 'nΓΊmero', 'Segundos mΓ‘ximos de espera en cola (defecto: 120).'],
['extensiones', 'array', 'Extensiones miembro de la cola, seleccionadas con checkboxes.'],
],
'ejemplos' => [
['Cola soporte con desborde', 'Cola q99_soporte 120s [timeout]β BuzΓ³n soporte'],
['Cola ventas', 'IVR [1]β Cola q99_ventas [timeout]β LocuciΓ³n + Colgar'],
],
],
[
'id' => 'buzon', 'icon' => 'π¬', 'color' => '#0369a1', 'titulo' => 'BuzΓ³n de voz',
'desc' => 'Graba un mensaje de voz del caller y lo envΓa por email con el MP3 adjunto. No tiene salida β es un punto final del flujo. El email configurado en el nodo es el destinatario directo, sin depender de ficheros de configuraciΓ³n externos.',
'salidas' => [],
'campos' => [
['label', 'string', 'Nombre del buzΓ³n (ej: Comercial, Soporte).'],
['audio', 'string', 'Audio que se reproduce antes de grabar. Configurable por tabs (Ruta, Existente, TTS).'],
['email', 'string', 'Uno o varios emails destinatarios separados por coma. Si se deja vacΓo se usa buzon@nonotel.es.'],
['max_seg', 'nΓΊmero', 'DuraciΓ³n mΓ‘xima de la grabaciΓ³n en segundos (defecto: 60).'],
],
'ejemplos' => [
['BuzΓ³n fuera de horario', 'Horario [fuera]β LocuciΓ³n (estamos cerrados) β BuzΓ³n general'],
['MΓΊltiples destinatarios', 'Grupo [noresp]β BuzΓ³n (email: dir@emp.com, sat@emp.com)'],
],
],
[
'id' => 'desvio', 'icon' => 'βοΈ', 'color' => '#dc2626', 'titulo' => 'DesvΓo',
'desc' => 'DesvΓa la llamada a una extensiΓ³n SIP interna (4 dΓgitos) o a un nΓΊmero externo via troncal. No tiene salida β fin del flujo.',
'salidas' => [],
'campos' => [
['label', 'string', 'Nombre descriptivo (ej: MΓ³vil guardia, Sede Barcelona).'],
['destino', 'string', 'ExtensiΓ³n de 4 dΓgitos para internas, o nΓΊmero externo completo (ej: 612345678) para externas.'],
['timeout', 'nΓΊmero', 'Segundos antes de colgar si no contesta (defecto: 60).'],
],
'ejemplos' => [
['DesvΓo a mΓ³vil guardia', 'Horario [fuera]β DesvΓo 612345678'],
['DesvΓo a extensiΓ³n interna', 'Grupo [noresp]β DesvΓo 9908 (supervisor)'],
],
],
[
'id' => 'condicion', 'icon' => 'β‘', 'color' => '#b45309', 'titulo' => 'CondiciΓ³n',
'desc' => 'EvalΓΊa el valor de una variable de canal de Asterisk y bifurca el flujo. Γtil para lΓ³gica dinΓ‘mica basada en el estado de la llamada.',
'salidas' => [
['si', 'La condiciΓ³n es verdadera'],
['no', 'La condiciΓ³n es falsa'],
],
'campos' => [
['variable', 'string', 'Nombre de la variable de canal Asterisk sin ${}. Ej: DIALSTATUS, GRABACION.'],
['operador', 'enum', 'Operador: =, !=, >, <, >=, <='],
['valor', 'string', 'Valor contra el que comparar.'],
],
'ejemplos' => [
['Bifurcar por resultado', 'CondiciΓ³n DIALSTATUS = ANSWER β [si] Colgar / [no] BuzΓ³n'],
['Flag personalizado', 'CondiciΓ³n VIP = 1 β [si] Grupo preferente / [no] Cola estΓ‘ndar'],
],
],
[
'id' => 'grabacion', 'icon' => 'βΊοΈ', 'color' => '#7c3aed', 'titulo' => 'GrabaciΓ³n',
'desc' => 'Activa la grabaciΓ³n de la llamada con MixMonitor. La grabaciΓ³n continΓΊa activa hasta que la llamada termina, independientemente de los nodos siguientes.',
'salidas' => [['ok', 'ContinΓΊa al siguiente elemento con la grabaciΓ³n ya activa']],
'campos' => [
['nombre', 'string', 'Nombre descriptivo.'],
['directorio', 'string', 'Ruta donde se guardan los ficheros WAV (ej: /home/nonotel/grabaciones).'],
],
'ejemplos' => [
['Grabar toda la llamada', 'Entrada DID β GrabaciΓ³n β IVR β Grupo'],
['Grabar solo soporte', 'IVR [2]β GrabaciΓ³n β Grupo soporte'],
],
],
[
'id' => 'espera', 'icon' => 'βΈοΈ', 'color' => '#6b7280', 'titulo' => 'Espera',
'desc' => 'Pausa la llamada N segundos antes de continuar. Γtil para dar tiempo entre locuciones o antes de conectar con un grupo.',
'salidas' => [['ok', 'ContinΓΊa tras los segundos configurados']],
'campos' => [
['segundos', 'nΓΊmero', 'Segundos de pausa (1-30, defecto: 2).'],
],
'ejemplos' => [
['Pausa entre mensajes', 'LocuciΓ³n bienvenida β Espera 2s β IVR'],
['Tiempo de procesado', 'Subrutina AGI β Espera 1s β Grupo'],
],
],
[
'id' => 'subrutina', 'icon' => 'βοΈ', 'color' => '#4b5563', 'titulo' => 'Subrutina',
'desc' => 'Ejecuta un contexto Asterisk existente via Gosub y vuelve al flujo al terminar. Permite integrar lΓ³gica personalizada (AGI, lookups, etc.) sin salir del flujo visual.',
'salidas' => [['ok', 'ContinΓΊa tras ejecutar la subrutina']],
'campos' => [
['nombre', 'string', 'Nombre descriptivo.'],
['contexto', 'string', 'Nombre del contexto en extensions.conf (debe existir previamente).'],
['exten', 'string', 'ExtensiΓ³n dentro del contexto (defecto: s).'],
['prio', 'string', 'Prioridad de inicio (defecto: 1).'],
],
'ejemplos' => [
['Lookup CRM', 'Entrada DID β Subrutina sub-crm-lookup β IVR personalizado'],
['Validar festivos especiales', 'Entrada DID β Subrutina sub-festivos β Horario'],
],
],
[
'id' => 'colgar', 'icon' => 'π΅', 'color' => '#6b7280', 'titulo' => 'Colgar',
'desc' => 'Cuelga la llamada explΓcitamente. Punto final del flujo. Nota: cualquier nodo sin conexiΓ³n en alguna de sus salidas tambiΓ©n cuelga automΓ‘ticamente.',
'salidas' => [],
'campos' => [],
'ejemplos' => [
['Fin tras buzΓ³n', 'BuzΓ³n β [cuelga automΓ‘ticamente al terminar la grabaciΓ³n]'],
['Colgar tras timeout IVR', 'IVR [timeout]β LocuciΓ³n (gracias por llamar) β Colgar'],
],
],
];
@endphp
@foreach($docs as $doc)
@endforeach