feat: finca visible en cada menu, entities por campo y aviso de comandos
Entities:
- Se conserva el mapa {campo: valor} en vez de aplanarlo. El pre-llenado de
formularios y el auto-registro de valores comparan la clave contra el nombre
del campo, asi que con la lista plana nunca se disparaban.
- entity_key acota cada dynamic_list a su propio campo: antes una finca llamada
"reposo" se comparaba contra grupos de mantenimiento y se descartaba ahi.
- Cada lista consume solo lo suyo, asi "finca reposo, grupo plateo" resuelve
las dos cosas en una frase.
Finca visible:
- Se guarda la etiqueta ademas del id al elegir una opcion.
- El footer de cada menu muestra la finca activa; sin finca queda el nombre de
la empresa, asi cat 1 no cambia. Los menus de botones ahora emiten footer.
- {finca} disponible en header, body y footer.
Aviso de comandos: los textos tras cada informe nombran menu, atras y salir.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
693623e10c
commit
a64421c527
@@ -213,6 +213,7 @@ $configJson = [
|
||||
'section_title' => 'Fincas disponibles',
|
||||
'meta_group' => 'finca',
|
||||
'meta_key' => 'finca_id',
|
||||
'entity_key' => 'finca',
|
||||
'next_node' => 'show_main_menu',
|
||||
'skip_if_set' => true,
|
||||
'nlu_description' => 'Seleccionar o cambiar la finca de trabajo',
|
||||
@@ -322,6 +323,7 @@ $configJson = [
|
||||
'section_title' => 'Grupos frecuentes',
|
||||
'meta_group' => 'grupo_mant',
|
||||
'meta_key' => 'grupo_id',
|
||||
'entity_key' => 'grupo',
|
||||
'next_node' => 'submenu_ciclo_mantenimiento',
|
||||
'append_options' => [['id' => 'select_grupo_mant_otros', 'title' => '➕ Otro grupo']],
|
||||
'nlu_description' => 'Informes de mantenimiento de un grupo (plateo, corona, poda...) — usar cuando NO dice qué informe quiere',
|
||||
|
||||
@@ -145,6 +145,69 @@ check('parado en un menú el NLU atiende',
|
||||
check('en medio de una lista no interfiere',
|
||||
$atiende('collecting', '', null, $flows), 'nlu');
|
||||
|
||||
echo "\nEntities por campo\n";
|
||||
|
||||
/** Espejo del matching de handleDynamicList con entity_key */
|
||||
$matchear = function (array $flow, array $entities, array $etiquetas): array {
|
||||
$ek = $flow['entity_key'] ?? '';
|
||||
$propias = [];
|
||||
if ($ek !== '') {
|
||||
foreach ($entities as $k => $v) if (mb_strtolower($k) === mb_strtolower($ek)) $propias[$k] = $v;
|
||||
} else {
|
||||
$propias = $entities;
|
||||
}
|
||||
foreach ($propias as $k => $v) {
|
||||
foreach ($etiquetas as $etiqueta) {
|
||||
$a = mb_strtolower($v); $b = mb_strtolower($etiqueta);
|
||||
if ($a === $b || str_contains($a, $b) || str_contains($b, $a)) {
|
||||
unset($entities[$k]);
|
||||
return ['match' => $etiqueta, 'sobran' => $entities];
|
||||
}
|
||||
}
|
||||
}
|
||||
return ['match' => null, 'sobran' => $entities];
|
||||
};
|
||||
|
||||
$dichas = ['finca' => 'reposo', 'grupo' => 'plateo'];
|
||||
$fincas = ['ROSA BLANCA', 'REPOSO', '🌐 Todas las fincas'];
|
||||
$grupos = ['PLATEO', 'CORONA', 'PODA'];
|
||||
|
||||
// Cada lista toma lo suyo y deja el resto para la siguiente
|
||||
$r1 = $matchear($flows['ask_finca'], $dichas, $fincas);
|
||||
check('ask_finca toma la finca', $r1['match'], 'REPOSO');
|
||||
check('y deja el grupo para después', $r1['sobran'], ['grupo' => 'plateo']);
|
||||
|
||||
$r2 = $matchear($flows['ciclo_mantenimiento'], $r1['sobran'], $grupos);
|
||||
check('ciclo_mantenimiento toma el grupo', $r2['match'], 'PLATEO');
|
||||
check('no queda nada sin consumir', $r2['sobran'], []);
|
||||
|
||||
// El bug que motivó todo: una finca no debe matchear contra grupos
|
||||
$r3 = $matchear($flows['ciclo_mantenimiento'], ['finca' => 'reposo'], $grupos);
|
||||
check('una finca no se consume como grupo', $r3['match'], null);
|
||||
check('y sobrevive para ask_finca', $r3['sobran'], ['finca' => 'reposo']);
|
||||
|
||||
echo "\nFinca visible en el menú\n";
|
||||
|
||||
/** Espejo de aplicarVarsMenu() */
|
||||
$footer = function (array $menu, string $finca): string {
|
||||
$f = $menu['footer'] ?? '';
|
||||
$f = str_replace('{finca}', $finca, $f);
|
||||
if ($finca !== '' && !str_contains($f, $finca)) $f = '📍 ' . $finca;
|
||||
return $f;
|
||||
};
|
||||
|
||||
$menus = $config['menus'];
|
||||
check('lista muestra la finca activa',
|
||||
$footer($menus['show_menu_cat2'], 'ROSA BLANCA'), '📍 ROSA BLANCA');
|
||||
check('"todas" se lee natural',
|
||||
$footer($menus['show_menu_cat2'], '🌐 Todas las fincas'), '📍 🌐 Todas las fincas');
|
||||
check('sin finca queda el footer de siempre',
|
||||
$footer($menus['show_menu_cat2'], ''), 'Palmas360');
|
||||
check('submenú de botones también la lleva',
|
||||
$footer($menus['submenu_ciclo_mantenimiento'], 'REPOSO'), '📍 REPOSO');
|
||||
check('entra en los 60 caracteres del footer',
|
||||
mb_strlen($footer($menus['show_menu_cat2'], 'ROSA BLANCA')) <= 60, true);
|
||||
|
||||
echo "\nask_finca\n";
|
||||
$af = $flows['ask_finca'];
|
||||
check('no repregunta si ya hay finca', $af['skip_if_set'] ?? false, true);
|
||||
|
||||
Reference in New Issue
Block a user