refactor: el alcance de fincas lo resuelve el ERP, no el bot

Los catalogos ahora mandan ?wa= igual que los informes, y el endpoint fincas
devuelve solo las asignadas a ese numero. El "Todas las fincas" se antepone
unicamente a quien no tiene restriccion: con dos de cinco asignadas no
significa nada claro.

Con eso sale sobrando todo el filtrado del lado del bot —scope_from,
alcanceDelNumero y fincas_json en PhoneSync— y queda una sola fuente de verdad,
del lado donde estan los datos.

Efecto util: con una sola finca asignada el catalogo trae un unico item y
handleDynamicList auto-selecciona, asi que el usuario nunca ve la pregunta.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-05 23:59:35 -05:00
co-authored by Claude Sonnet 4.6
parent 478ba3ea73
commit 94d4dcd26a
4 changed files with 34 additions and 64 deletions
-2
View File
@@ -253,8 +253,6 @@ $configJson = [
'meta_group' => 'finca',
'meta_key' => 'finca_id',
'entity_key' => 'finca',
// Solo las fincas que el ERP le asigno a este numero
'scope_from' => 'fincas',
'next_node' => 'show_main_menu',
'skip_if_set' => true,
'nlu_description' => 'Seleccionar o cambiar la finca de trabajo',
+19 -16
View File
@@ -511,26 +511,29 @@ check('el bot ya no reordena por su cuenta',
echo "\nAlcance de fincas por número\n";
check('ask_finca respeta el alcance del número',
$flows['ask_finca']['scope_from'] ?? null, 'fincas');
/** Espejo del filtro de handleDynamicList */
$acotar = function (array $items, array $permitidas): array {
if (!$permitidas) return array_column($items, 'id');
return array_column(array_values(array_filter($items,
fn($i) => $i['id'] === '0' || in_array($i['id'], $permitidas, true))), 'id');
/**
* Espejo del endpoint fincas: acota al alcance del numero y antepone "Todas"
* solo a quien no tiene restriccion. Con dos de cinco asignadas, "todas" no
* significa nada claro, asi que no se ofrece.
*/
$catalogoFincas = function (array $activas, array $alcance): array {
if ($alcance) {
$activas = array_values(array_filter($activas, fn($f) => in_array($f['id'], $alcance, true)));
}
$lista = array_column($activas, 'id');
if (!$alcance) array_unshift($lista, '0');
return $lista;
};
$catalogo = [['id' => '0'], ['id' => '4'], ['id' => '7'], ['id' => '9']];
$activas = [['id' => '4'], ['id' => '7'], ['id' => '9']];
check('sin restricción ve todas', $acotar($catalogo, []), ['0', '4', '7', '9']);
check('con dos fincas ve solo esas', $acotar($catalogo, ['4', '9']), ['0', '4', '9']);
check('"todas" sobrevive al filtro', in_array('0', $acotar($catalogo, ['4']), true), true);
check('sin restricción ve todas y el "Todas"', $catalogoFincas($activas, []), ['0', '4', '7', '9']);
check('con dos asignadas ve solo esas', $catalogoFincas($activas, ['4', '9']), ['4', '9']);
check('y sin el "Todas"', in_array('0', $catalogoFincas($activas, ['4', '9']), true), false);
// Una sola finca: handleDynamicList auto-selecciona con un unico item, pero el
// "todas" cuenta como segundo, asi que igual pregunta. Es correcto: elegir entre
// "su finca" y "todas las suyas" son cosas distintas si mañana le suman otra.
check('una sola finca deja dos opciones', $acotar($catalogo, ['7']), ['0', '7']);
// Una sola finca: un unico item, y handleDynamicList auto-selecciona en ese caso
check('con una sola no hay nada que preguntar', $catalogoFincas($activas, ['7']), ['7']);
check('el bot ya no filtra por su cuenta', isset($flows['ask_finca']['scope_from']), false);
echo "\nask_finca\n";
$af = $flows['ask_finca'];