diff --git a/services/AiBot.php b/services/AiBot.php index 32b79e6..bd12d21 100644 --- a/services/AiBot.php +++ b/services/AiBot.php @@ -403,7 +403,8 @@ PROMPT; $type = $flow['type'] ?? 'text'; $fn = $flow['function'] ?? ''; - $isUpload = in_array($type, ['collect_and_post', 'collect_for_each', 'submit_form'], true); + $isUpload = in_array($type, ['collect_and_post', 'collect_for_each', 'submit_form'], true) + || ($type === 'function' && $fn === 'upload_ciclo'); $isDownload = ($type === 'function' && $fn === 'api_report'); // Permission filter: diff --git a/services/NormalBot.php b/services/NormalBot.php index 4dac10d..ace58cb 100644 --- a/services/NormalBot.php +++ b/services/NormalBot.php @@ -103,20 +103,54 @@ class NormalBot return $response; } - // 6. Fallback flow + // 6. NLU routing — si está habilitado, intenta mapear texto libre a un flow antes del fallback + if (!$suppressFallback && ($config['nlu_enabled'] ?? false)) { + $context['permission_type'] ??= (int)$permType; + $route = AiBot::routeOrChat($company, $context, $input); + if ($route['action'] === 'route' && isset($route['key'])) { + $key = $route['key']; + // reset_finca: limpiar finca del meta y relanzar ask_finca + if ($key === 'reset_finca') { + $m = ConversationContext::getMetadata($ctxId); + unset($m['finca']); + ConversationContext::updateMetadata($ctxId, $m); + $key = 'ask_finca'; + } + // Inyectar entities para auto-select en dynamic_list + if (!empty($route['entities'])) { + $m = ConversationContext::getMetadata($ctxId); + $m['__nlu_entities'] = array_values($route['entities']); + ConversationContext::updateMetadata($ctxId, $m); + } + if (isset($flows[$key])) { + ConversationContext::updateNode($ctxId, $key); + return self::handleFlow($flows[$key], $context, $company, $ctxId, $menus); + } + if (isset($menus[$key])) { + ConversationContext::updateNode($ctxId, $key); + return self::buildMenuResponse($menus[$key], $context['from'], $company); + } + } + if ($route['action'] === 'chat' && ($route['text'] ?? '') !== '') { + ConversationContext::updateNode($ctxId, null); + return self::sendText($route['text'], $context['from'], $company); + } + } + + // 7. Fallback flow $fallbackFlowId = $perType['fallback_flow'] ?? $config['fallback_flow'] ?? null; if ($fallbackFlowId !== null && isset($flows[$fallbackFlowId])) { ConversationContext::updateNode($ctxId, $fallbackFlowId); return self::handleFlow($flows[$fallbackFlowId], $context, $company, $ctxId, $menus); } - // 7. Greeting menu as fallback (texto no reconocido después de estar en __greeted) + // 8. Greeting menu as fallback (texto no reconocido después de estar en __greeted) if (!$suppressFallback && $greetingMenuKey !== null && isset($menus[$greetingMenuKey])) { ConversationContext::updateNode($ctxId, '__greeted'); return self::buildMenuResponse($menus[$greetingMenuKey], $context['from'], $company); } - // 8. Static fallback text + // 9. Static fallback text if (!$suppressFallback) { $fallback = $perType['fallback'] ?? $config['fallback'] ?? null; if ($fallback !== null) { @@ -1081,6 +1115,20 @@ class NormalBot ConversationContext::reset($ctxId); return self::sendText("Hasta luego 👋\n\nEscribe *menu* cuando quieras volver.", $context['from'], $company); })(), + 'reset_finca' => (function () use ($ctxId, $context, $company) { + $m = ConversationContext::getMetadata($ctxId); + unset($m['finca']); + ConversationContext::updateMetadata($ctxId, $m); + $cfg = self::getConfig($company); + $permType = (string)($company['_permission_type'] ?? 1); + $pt = $cfg['per_type'][$permType] ?? []; + $allFlows = array_merge($cfg['flows'] ?? [], $pt['flows'] ?? []); + $allMenus = array_merge($cfg['menus'] ?? [], $pt['menus'] ?? []); + ConversationContext::updateNode($ctxId, 'ask_finca'); + return isset($allFlows['ask_finca']) + ? self::handleFlow($allFlows['ask_finca'], $context, $company, $ctxId, $allMenus) + : self::sendText('¿En qué finca trabajas?', $context['from'], $company); + })(), 'forward_to_ai' => null, 'api_report' => self::executeApiReport($params, $context, $company, $ctxId), default => null, diff --git a/setup/seed_palmas.php b/setup/seed_palmas.php index ab5db7f..a7cb246 100644 --- a/setup/seed_palmas.php +++ b/setup/seed_palmas.php @@ -9,9 +9,10 @@ $db = db(); // ─── CONFIG JSON completo (Company 2 y 3 comparten la misma base) ──────────── $configJson = [ - 'greeting' => '¡Bienvenido a Palmas360! Escribe *menu* para ver las opciones disponibles.', - 'fallback' => 'No entendí. Escribe *menu* para ver las opciones disponibles.', - 'commands' => [ + 'greeting' => '¡Bienvenido a Palmas360! Escribe *menu* para ver las opciones disponibles.', + 'fallback' => 'No entendí. Escribe *menu* para ver las opciones disponibles.', + 'nlu_enabled' => true, + 'commands' => [ 'menu' => 'show_main_menu', 'informes' => 'descargar_informes', 'info' => 'enviar_informacion', @@ -203,81 +204,89 @@ $configJson = [ 'meta_group' => 'finca', 'meta_key' => 'finca_id', 'next_node' => 'show_main_menu', + 'nlu_description' => 'Seleccionar o cambiar la finca de trabajo', + ], + + // Acción NLU: limpiar finca y volver a ask_finca + 'reset_finca' => [ + 'type' => 'function', + 'function' => 'reset_finca', + 'nlu_description' => 'Cambiar de finca o seleccionar una finca diferente', ], // Producción (texto del mes + PDF encadenado) - 'produccion_total' => ['type' => 'function', 'function' => 'api_report', 'params' => [ + 'produccion_total' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Producción total facturada del mes actual con PDF del año', 'params' => [ 'endpoint_key' => 'produccion_total_bot_dn', 'date_mode' => 'current_month', 'next_endpoint_key' => 'produccion_total_pdf_bot_dn', 'next_caption' => '📊 Producción del año (PDF)', 'next_filename' => 'produccion_año.pdf', ]], - 'produccion_lotes' => ['type' => 'function', 'function' => 'api_report', 'params' => [ + 'produccion_lotes' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Producción detallada por lotes en Excel', 'params' => [ 'endpoint_key' => 'produccion_lotes_bot_dn', 'filename' => 'produccion_lotes.xlsx', 'caption' => 'Producción por lotes del año', ]], // Ausentismos - 'ausentismos_hoy' => ['type' => 'function', 'function' => 'api_report', 'params' => [ + 'ausentismos_hoy' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Ausentismos de hoy, quién faltó hoy', 'params' => [ 'endpoint_key' => 'ausentismos_bot_texto_dn', 'date_mode' => 'today', ]], - 'ausentismos_semana' => ['type' => 'function', 'function' => 'api_report', 'params' => [ + 'ausentismos_semana' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Ausentismos de esta semana', 'params' => [ 'endpoint_key' => 'ausentismos_bot_texto_dn', 'date_mode' => 'last_7', ]], - 'ausentismos_mes' => ['type' => 'function', 'function' => 'api_report', 'params' => [ + 'ausentismos_mes' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Reporte PDF de ausentismos del mes', 'params' => [ 'endpoint_key' => 'ausentismos_bot_pdf_dn', 'date_mode' => 'current_month', 'filename' => 'ausentismos_mes.pdf', 'caption' => 'Ausentismos del mes', ]], - // Menus de sección - 'submenu_produccion' => ['type' => 'menu', 'menu' => 'submenu_produccion'], - 'submenu_ciclos' => ['type' => 'menu', 'menu' => 'submenu_ciclos'], - 'submenu_ciclos_sanidad' => ['type' => 'menu', 'menu' => 'submenu_ciclos_sanidad'], - 'submenu_ausentismos' => ['type' => 'menu', 'menu' => 'submenu_ausentismos'], + // Menus de sección (nlu_skip: navegación interna, no exponer al NLU) + 'submenu_produccion' => ['type' => 'menu', 'menu' => 'submenu_produccion', 'nlu_skip' => true], + 'submenu_ciclos' => ['type' => 'menu', 'menu' => 'submenu_ciclos', 'nlu_skip' => true], + 'submenu_ciclos_sanidad' => ['type' => 'menu', 'menu' => 'submenu_ciclos_sanidad', 'nlu_skip' => true], + 'submenu_ausentismos' => ['type' => 'menu', 'menu' => 'submenu_ausentismos', 'nlu_skip' => true], // Ciclos — cada uno abre un sub-menú de 3 opciones - 'ciclo_cosecha' => ['type' => 'menu', 'menu' => 'submenu_ciclo_cosecha'], - 'ciclo_polinizacion' => ['type' => 'menu', 'menu' => 'submenu_ciclo_polinizacion'], - 'ciclo_plagas' => ['type' => 'menu', 'menu' => 'submenu_ciclo_plagas'], - 'ciclo_censo' => ['type' => 'menu', 'menu' => 'submenu_ciclo_censo'], - 'ciclo_palm' => ['type' => 'menu', 'menu' => 'submenu_ciclo_palm'], - 'ciclo_tratamiento' => ['type' => 'menu', 'menu' => 'submenu_ciclo_tratamiento'], + 'ciclo_cosecha' => ['type' => 'menu', 'menu' => 'submenu_ciclo_cosecha', 'nlu_description' => 'Ver ciclos de cosecha (lotes más largos o todos)'], + 'ciclo_polinizacion' => ['type' => 'menu', 'menu' => 'submenu_ciclo_polinizacion', 'nlu_description' => 'Ver ciclos de polinización'], + 'ciclo_plagas' => ['type' => 'menu', 'menu' => 'submenu_ciclo_plagas', 'nlu_description' => 'Ver ciclos de plagas'], + 'ciclo_censo' => ['type' => 'menu', 'menu' => 'submenu_ciclo_censo', 'nlu_description' => 'Ver ciclos de censo'], + 'ciclo_palm' => ['type' => 'menu', 'menu' => 'submenu_ciclo_palm', 'nlu_description' => 'Ver ciclos de Palmarum (Rhynchophorus)'], + 'ciclo_tratamiento' => ['type' => 'menu', 'menu' => 'submenu_ciclo_tratamiento', 'nlu_description' => 'Ver ciclos de tratamientos'], // Sub-opciones: cosecha - 'ciclo_cosecha_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'cosecha_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_cosecha_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'cosecha_todos_dn','date_mode'=>'today','filename'=>'ciclos_cosecha.pdf','caption'=>'Ciclos de Cosecha — todos los lotes']], - 'ciclo_cosecha_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'cosecha_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_cosecha.pdf','caption'=>'Histórico Cosecha — últimos 30 días']], + 'ciclo_cosecha_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de cosecha con ciclos más largos','params'=>['endpoint_key'=>'cosecha_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_cosecha_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de cosecha todos los lotes','params'=>['endpoint_key'=>'cosecha_todos_dn','date_mode'=>'today','filename'=>'ciclos_cosecha.pdf','caption'=>'Ciclos de Cosecha — todos los lotes']], + 'ciclo_cosecha_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de cosecha últimos 30 días','params'=>['endpoint_key'=>'cosecha_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_cosecha.pdf','caption'=>'Histórico Cosecha — últimos 30 días']], // Sub-opciones: polinizacion - 'ciclo_polinizacion_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'polinizacion_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_polinizacion_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'polinizacion_todos_dn','date_mode'=>'today','filename'=>'ciclos_polinizacion.pdf','caption'=>'Ciclos de Polinización — todos los lotes']], - 'ciclo_polinizacion_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'polinizacion_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_polinizacion.pdf','caption'=>'Histórico Polinización — últimos 30 días']], + 'ciclo_polinizacion_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de polinización con ciclos más largos','params'=>['endpoint_key'=>'polinizacion_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_polinizacion_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de polinización todos los lotes','params'=>['endpoint_key'=>'polinizacion_todos_dn','date_mode'=>'today','filename'=>'ciclos_polinizacion.pdf','caption'=>'Ciclos de Polinización — todos los lotes']], + 'ciclo_polinizacion_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de polinización últimos 30 días','params'=>['endpoint_key'=>'polinizacion_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_polinizacion.pdf','caption'=>'Histórico Polinización — últimos 30 días']], // Sub-opciones: plagas - 'ciclo_plagas_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'plagas_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_plagas_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'plagas_todos_dn','date_mode'=>'today','filename'=>'ciclos_plagas.pdf','caption'=>'Ciclos de Plagas — todos los lotes']], - 'ciclo_plagas_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'plagas_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_plagas.pdf','caption'=>'Histórico Plagas — últimos 30 días']], + 'ciclo_plagas_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de plagas con ciclos más largos','params'=>['endpoint_key'=>'plagas_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_plagas_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de plagas todos los lotes','params'=>['endpoint_key'=>'plagas_todos_dn','date_mode'=>'today','filename'=>'ciclos_plagas.pdf','caption'=>'Ciclos de Plagas — todos los lotes']], + 'ciclo_plagas_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de plagas últimos 30 días','params'=>['endpoint_key'=>'plagas_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_plagas.pdf','caption'=>'Histórico Plagas — últimos 30 días']], // Sub-opciones: censo - 'ciclo_censo_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'censo_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_censo_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'censo_todos_dn','date_mode'=>'today','filename'=>'ciclos_censo.pdf','caption'=>'Ciclos de Censo — todos los lotes']], - 'ciclo_censo_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'censo_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_censo.pdf','caption'=>'Histórico Censo — últimos 30 días']], + 'ciclo_censo_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de censo con ciclos más largos','params'=>['endpoint_key'=>'censo_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_censo_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de censo todos los lotes','params'=>['endpoint_key'=>'censo_todos_dn','date_mode'=>'today','filename'=>'ciclos_censo.pdf','caption'=>'Ciclos de Censo — todos los lotes']], + 'ciclo_censo_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de censo últimos 30 días','params'=>['endpoint_key'=>'censo_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_censo.pdf','caption'=>'Histórico Censo — últimos 30 días']], // Sub-opciones: palm - 'ciclo_palm_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'palm_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_palm_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'palm_todos_dn','date_mode'=>'today','filename'=>'ciclos_palmarum.pdf','caption'=>'Ciclos de Palmarum — todos los lotes']], - 'ciclo_palm_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'palm_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_palmarum.pdf','caption'=>'Histórico Palmarum — últimos 30 días']], + 'ciclo_palm_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de Palmarum con ciclos más largos','params'=>['endpoint_key'=>'palm_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_palm_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de Palmarum todos los lotes','params'=>['endpoint_key'=>'palm_todos_dn','date_mode'=>'today','filename'=>'ciclos_palmarum.pdf','caption'=>'Ciclos de Palmarum — todos los lotes']], + 'ciclo_palm_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de Palmarum últimos 30 días','params'=>['endpoint_key'=>'palm_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_palmarum.pdf','caption'=>'Histórico Palmarum — últimos 30 días']], // Sub-opciones: tratamiento - 'ciclo_tratamiento_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'tratamiento_top_texto_bot_dn','date_mode'=>'last_30']], - 'ciclo_tratamiento_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'tratamiento_todos_dn','date_mode'=>'today','filename'=>'ciclos_tratamientos.pdf','caption'=>'Ciclos de Tratamientos — todos los lotes']], - 'ciclo_tratamiento_historico'=> ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'tratamiento_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_tratamientos.pdf','caption'=>'Histórico Tratamientos — últimos 30 días']], + 'ciclo_tratamiento_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de tratamiento con ciclos más largos','params'=>['endpoint_key'=>'tratamiento_top_texto_bot_dn','date_mode'=>'last_30']], + 'ciclo_tratamiento_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de tratamientos todos los lotes','params'=>['endpoint_key'=>'tratamiento_todos_dn','date_mode'=>'today','filename'=>'ciclos_tratamientos.pdf','caption'=>'Ciclos de Tratamientos — todos los lotes']], + 'ciclo_tratamiento_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de tratamientos últimos 30 días','params'=>['endpoint_key'=>'tratamiento_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_tratamientos.pdf','caption'=>'Histórico Tratamientos — últimos 30 días']], // ciclo_mantenimiento → selección dinámica de grupo (top3 + "Otro") 'ciclo_mantenimiento' => [ @@ -292,6 +301,7 @@ $configJson = [ 'meta_key' => 'grupo_id', 'next_node' => 'submenu_ciclo_mantenimiento', 'append_options' => [['id' => 'select_grupo_mant_otros', 'title' => '➕ Otro grupo']], + 'nlu_description' => 'Ver ciclos de mantenimiento por grupo (plateo, corona, poda, etc.)', ], 'select_grupo_mant_otros' => [ 'type' => 'dynamic_list', @@ -304,19 +314,20 @@ $configJson = [ 'meta_group' => 'grupo_mant', 'meta_key' => 'grupo_id', 'next_node' => 'submenu_ciclo_mantenimiento', + 'nlu_skip' => true, ], // Sub-opciones: mantenimiento - 'ciclo_mantenimiento_top' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'mantenimiento_top_texto_bot_dn','date_mode'=>'today']], - 'ciclo_mantenimiento_todos' => ['type'=>'function','function'=>'api_report','params'=>['endpoint_key'=>'mantenimiento_todos_bot_dn','date_mode'=>'today','filename'=>'mantenimiento_todos.pdf','caption'=>'Mantenimiento — todos los lotes']], + 'ciclo_mantenimiento_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de mantenimiento con ciclos más largos (texto)','params'=>['endpoint_key'=>'mantenimiento_top_texto_bot_dn','date_mode'=>'today']], + 'ciclo_mantenimiento_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de mantenimiento todos los lotes del grupo seleccionado','params'=>['endpoint_key'=>'mantenimiento_todos_bot_dn','date_mode'=>'today','filename'=>'mantenimiento_todos.pdf','caption'=>'Mantenimiento — todos los lotes']], // Upload - 'enviar_informacion' => ['type' => 'menu', 'menu' => 'submenu_subir_ciclos'], - 'subir_ciclo_cosecha' => ['type' => 'function', 'function' => 'upload_ciclo', 'params' => ['ciclo' => 'cosecha']], + 'enviar_informacion' => ['type' => 'menu', 'menu' => 'submenu_subir_ciclos', 'nlu_skip' => true], + 'subir_ciclo_cosecha' => ['type' => 'function', 'function' => 'upload_ciclo', 'nlu_description' => 'Subir o enviar un ciclo de cosecha', 'params' => ['ciclo' => 'cosecha']], - // Alias globales - 'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2'], - 'descargar_informes' => ['type' => 'menu', 'menu' => 'show_menu_cat2'], + // Alias globales (nlu_skip: son alias de navegación) + 'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'nlu_skip' => true], + 'descargar_informes' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'nlu_skip' => true], ], // ── Per-type config ───────────────────────────────────────────────────── @@ -357,7 +368,7 @@ $configJson = [ '2' => [ 'greeting_flow' => 'ask_finca', 'fallback_flow' => 'show_menu_cat2', - 'greeting' => null, + 'greeting' => '', 'fallback' => null, 'commands' => ['menu' => 'show_menu_cat2'], 'menus' => [ @@ -390,7 +401,7 @@ $configJson = [ '3' => [ 'greeting_flow' => 'ask_finca', 'fallback_flow' => 'show_main_menu', - 'greeting' => null, + 'greeting' => '', 'fallback' => null, 'commands' => ['menu' => 'show_main_menu'], 'menus' => [],