diff --git a/services/NormalBot.php b/services/NormalBot.php index c3baa62..be73144 100644 --- a/services/NormalBot.php +++ b/services/NormalBot.php @@ -1826,6 +1826,12 @@ class NormalBot ConversationContext::reset($ctxId); return self::sendText("❌ Registro cancelado.\n\nEscribe *menu* para volver.", $context['from'], $company); } + // La fecha previa al bucle se elige de una lista, así que llega por acá + // y no como texto. Sin esto el flujo se quedaba mudo tras elegirla. + $fe = $meta['__foreach']; + if (!empty($fe['ask_date']) && ($fe['fecha'] ?? null) === null) { + return self::handleForeachInput($meta, $input, $context, $company, $ctxId, $flows); + } } // Standard button/row resolution against static menus diff --git a/setup/test_navegacion.php b/setup/test_navegacion.php index e0f93e8..808d1e0 100644 --- a/setup/test_navegacion.php +++ b/setup/test_navegacion.php @@ -349,6 +349,28 @@ check('los ids son los de finca', array_column($body['fincas'], 'id'), ['4', '7 check('sin fecha usa hoy', $armarBody(['collected' => []], 'x', 'y')['fecha'], date('Y-m-d')); +echo "\nRuteo de respuestas interactivas en collect_for_each\n"; + +/** Espejo del bloque __foreach de processInteractive() */ +$rutaFe = function (array $fe, string $input): string { + if ($input === '__foreach_confirm') return 'enviar'; + if ($input === '__foreach_cancel') return 'cancelar'; + if (!empty($fe['ask_date']) && ($fe['fecha'] ?? null) === null) return 'foreach-input'; + return 'menus'; +}; + +$esperandoFecha = ['ask_date' => true, 'fecha' => null]; +$conFecha = ['ask_date' => true, 'fecha' => '2026-08-04']; + +// El bug: elegir la fecha caía en la resolución de menús y moría en silencio +check('elegir la fecha llega al flujo', $rutaFe($esperandoFecha, '2026-08-04'), 'foreach-input'); +check('"otra fecha" también', $rutaFe($esperandoFecha, '__fe_other'), 'foreach-input'); +check('confirmar sigue enviando', $rutaFe($esperandoFecha, '__foreach_confirm'), 'enviar'); +check('cancelar sigue cancelando', $rutaFe($esperandoFecha, '__foreach_cancel'), 'cancelar'); +// Con la fecha resuelta no debe secuestrar la navegación por menús +check('con fecha ya elegida no interfiere', $rutaFe($conFecha, 'submenu_ciclos'), 'menus'); +check('un foreach sin fecha tampoco', $rutaFe(['ask_date' => false], 'submenu_ciclos'), 'menus'); + echo "\nask_finca\n"; $af = $flows['ask_finca']; check('no repregunta si ya hay finca', $af['skip_if_set'] ?? false, true);