From f06a400d168f9217eb22f20f194db9018b5ab4e0 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 4 Aug 2026 20:38:40 -0500 Subject: [PATCH] fix: pluviometria se quedaba muda tras elegir la fecha El selector de fecha que agregue a collect_for_each responde por lista, pero el bloque __foreach de processInteractive solo contemplaba confirmar y cancelar: la fecha caia en la resolucion de menus estaticos, no coincidia con ninguno y el flujo moria sin mensaje. Hasta ahora collect_for_each solo recibia numeros escritos, por eso nunca hizo falta ese ruteo. Solo se desvia mientras se espera la fecha, para no secuestrar la navegacion por menus durante el resto del bucle. Co-Authored-By: Claude Sonnet 4.6 --- services/NormalBot.php | 6 ++++++ setup/test_navegacion.php | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) 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);