feat: los motivos de ausentismo mas usados aparecen primero

El catalogo llega ordenado alfabeticamente y son 17 opciones, asi que el motivo
habitual quedaba en cualquier lado y a veces en la segunda pagina.

El bot cuenta que elige cada usuario y los sube. Es por usuario y no global a
proposito: quien registra incapacidades registra sobre todo incapacidades, y
eso le sirve mas que un promedio de toda la operacion.

El orden de PHP 8 es estable, asi que los empates conservan el alfabetico. El
contador se limita a 20 entradas y sobrevive al reset que corre tras cada
registro. Va como opcion por campo (frecuentes) para no reordenar listas donde
el alfabetico importa, como los lotes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-05 23:12:49 -05:00
co-authored by Claude Sonnet 4.6
parent 6ff2914162
commit 2d92867431
3 changed files with 69 additions and 1 deletions
+28
View File
@@ -462,6 +462,34 @@ check('el POST manda un array de ids', array_map('strval', array_keys($alternar(
check('accesible desde enviar información', $enMenu($config, '3', 'registrar_ciclo'), true);
echo "\nMotivos más usados primero\n";
check('el motivo aprende del uso', $campos['novedad_id']['frecuentes'] ?? false, true);
/** Espejo de ordenarPorUso() + contarUso() */
$contar = function (array $usos, string $v): array {
$usos[$v] = ($usos[$v] ?? 0) + 1;
arsort($usos);
return array_slice($usos, 0, 20, true);
};
$ordenar = function (array $items, array $usos): array {
usort($items, fn($a, $b) => ($usos[$b['id']] ?? 0) <=> ($usos[$a['id']] ?? 0));
return array_column($items, 'id');
};
$catalogo = [['id' => '25'], ['id' => '34'], ['id' => '35'], ['id' => '41']];
check('sin historial respeta el catálogo', $ordenar($catalogo, []), ['25', '34', '35', '41']);
$usos = [];
foreach (['35', '35', '35', '41'] as $v) $usos = $contar($usos, $v);
check('cuenta cada elección', $usos, ['35' => 3, '41' => 1]);
check('sube los más usados y desempata alfabético',
$ordenar($catalogo, $usos), ['35', '41', '25', '34']);
// El contador vive en el metadata, que se limpia tras cada registro
check('los usos sobreviven al reset',
in_array('__usos', ['finca', 'grupo_mant', '__saludo', '__usos'], true), true);
echo "\nask_finca\n";
$af = $flows['ask_finca'];
check('no repregunta si ya hay finca', $af['skip_if_set'] ?? false, true);