feat: ausentismo en dos pasos — tipo y despues motivo

17 motivos en una sola lista llegaban con el nombre cortado a 24 caracteres,
el limite de WhatsApp, y costaban de entender. Ahora primero se elige el tipo
—Incapacidad, Permiso, Licencia, Ausencia, Vacaciones...— y despues solo los
motivos de ese tipo.

Quitar el prefijo del grupo libera los caracteres que faltaban: "INCAPACIDAD
ENFERMEDAD < 3 DIAS" queda en "ENFERMEDAD < 3 DIAS". Sin siglas, que era la
otra opcion pero empeoraba justo lo que el cliente pidio arreglar. El nombre
completo va en la descripcion de la fila, asi no se pierde nada.

El ERP agrupa por nombre y no por id, para que una novedad nueva caiga sola en
su grupo; lo que no reconoce queda en 'Otros', visible.

desc_field es nuevo en los select: antes solo el multi_select podia describir.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-20 22:48:19 -05:00
co-authored by Claude Sonnet 4.6
parent 5ee2cfe2e6
commit 2ef3091260
4 changed files with 58 additions and 14 deletions
+14 -9
View File
@@ -47,15 +47,20 @@ check('con los tres del catálogo', count(filasDe($r)), 3);
$r = NormalBot::processInteractive($co, $ctx, '412');
$filas = filasDe($r);
check('sigue el motivo, paginado: 9 + "Ver más"', count($filas), 10);
check('la última fila es "Ver más"', isset($filas['__mas']));
check('sigue el tipo, no los 17 motivos de una',
array_keys($filas), ['Incapacidad', 'Permiso', 'Vacaciones']);
$r = NormalBot::processInteractive($co, $ctx, '__mas');
$r = NormalBot::processInteractive($co, $ctx, 'Incapacidad');
$filas = filasDe($r);
check('la página 2 trae las 8 restantes', count($filas), 8);
check('y ya sin "Ver más"', !isset($filas['__mas']));
check('el motivo se acota al tipo elegido', array_map('strval', array_keys($filas)), ['46', '47']);
check('sin el prefijo del grupo, entra en los 24 de WhatsApp',
max(array_map('mb_strlen', $filas)) <= 24);
$p = json_decode($r['payload'], true);
$fila0 = $p['interactive']['action']['sections'][0]['rows'][0];
check('y el nombre completo va en la descripción',
$fila0['description'] ?? null, 'INCAPACIDAD ENFERMEDAD < 3 DIAS');
$r = NormalBot::processInteractive($co, $ctx, '112');
$r = NormalBot::processInteractive($co, $ctx, '46');
check('sigue la fecha inicial', str_contains(textoDe($r), 'Desde qué fecha'));
$hoy = date('Y-m-d'); $ayer = date('Y-m-d', strtotime('-1 day'));
@@ -78,7 +83,7 @@ check('el POST llegó al ERP', $post !== null);
check('con el contrato exacto del procesador',
[$post['body']['empleado_id'] ?? null, $post['body']['novedad_id'] ?? null,
$post['body']['fecha_inicial'] ?? null, $post['body']['fecha_final'] ?? null],
['412', '112', $hoy, $hoy]);
['412', '46', $hoy, $hoy]);
check('y la trazabilidad', $post['body']['telefono'] ?? null, '57300AUSEN');
// ════ 3. Ausentismo según el perfil del número ═══════════════════════════════
@@ -89,8 +94,8 @@ fakePhone('57300JEFE', 412, 1);
$ctx = contexto('57300TRABAJADOR');
$r = NormalBot::processInteractive($co, $ctx, 'registrar_ausentismo');
check('el trabajador vinculado no se pregunta: arranca por el motivo',
str_contains(textoDe($r), 'motivo del ausentismo'));
check('el trabajador vinculado no se pregunta: arranca por el tipo',
str_contains(textoDe($r), 'tipo de ausentismo'));
$ctx = contexto('57300JEFE');
$r = NormalBot::processInteractive($co, $ctx, 'registrar_ausentismo');