diff --git a/services/BotRouter.php b/services/BotRouter.php index 126f0aa..67d36a2 100644 --- a/services/BotRouter.php +++ b/services/BotRouter.php @@ -125,13 +125,20 @@ class BotRouter if ($text !== null && trim($text) !== '') { self::log("NLU media [{$inputType}]: texto extraído → \"{$text}\""); - // Confirmar al usuario lo que entendió - $prefix = $inputType === 'audio' ? '🎤 Transcripción' : '🖼️ Imagen analizada'; + $prefix = $inputType === 'audio' ? '🎤 Escuché' : '🖼️ Imagen analizada'; WhatsAppSender::sendText( $context['from'], "{$prefix}: _{$text}_", $context['phone_number_id'] ?? '' ); + + // Si el usuario está en medio de un flujo activo, el texto va directo + // a NormalBot como respuesta al paso actual — no al NLU + if (self::hasActiveFlow((int)$company['id'], $context['from'])) { + self::log("NLU media: flujo activo detectado → NormalBot recibe \"{$text}\""); + return self::runNormalBot($company, $context, $text, 'text', false); + } + return self::runNluOnText($company, $context, $text, $config); } } @@ -155,6 +162,13 @@ class BotRouter return self::categoryMenuFallback($company, $context, $config); } + private static function hasActiveFlow(int $companyId, string $phone): bool + { + $botCtx = ConversationContext::getOrCreate($companyId, $phone, 'normal'); + $meta = ConversationContext::getMetadata((int)$botCtx['id']); + return !empty($meta['__cap']) || !empty($meta['__foreach']) || !empty($meta['collecting']) || !empty($meta['__api_vars']); + } + private static function runNluOnText(array $company, array $context, string $input, array $config): ?array { $result = AiBot::routeOrChat($company, $context, $input);