feat: flujo de registro de ausentismo (Fase 1, carga de datos)
Primer flujo de POST. El bot recolecta trabajador, motivo y rango de fechas, y postea a ausentismos_up; Palmas360 decide si auto-aprueba o encola para revision, como ya hace bot_entrada. El campo lookup asumia que el endpoint devolvia un solo objeto, pero /empleados devuelve una lista paginada: con eso el trabajador salia como "Desconocido" y sin id. Ahora distingue lista de objeto, y si hay varias coincidencias las ofrece para elegir en vez de quedarse con la primera. Campos opcionales del contrato (eps, diagnostico_id) quedan fuera hasta confirmar con Palmas360 que novedades son incapacidad. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
0bb1d3447e
commit
0e72aa3d5a
@@ -253,6 +253,49 @@ $m2 = [];
|
||||
check('sin nombre no rompe el saludo',
|
||||
str_starts_with($saludar($config, '2', $m2, '2026-08-01', ''), 'Hola,'), true);
|
||||
|
||||
echo "\nAusentismo (POST)\n";
|
||||
|
||||
$aus = $flows['registrar_ausentismo'] ?? [];
|
||||
$campos = array_column($aus['fields'] ?? [], null, 'key');
|
||||
|
||||
// Contrato de BotEntradaProcesador::ausentismo()
|
||||
$requeridos = ['empleado_id', 'novedad_id', 'fecha_inicial', 'fecha_final'];
|
||||
check('recolecta los 4 campos que exige el ERP',
|
||||
array_values(array_intersect($requeridos, array_keys($campos))), $requeridos);
|
||||
|
||||
check('el trabajador se busca por nombre',
|
||||
($campos['empleado_id']['lookup_param'] ?? null), 'filtro');
|
||||
check('lee id/nombre como los devuelve /empleados',
|
||||
[$campos['empleado_id']['value_field'] ?? null, $campos['empleado_id']['display_field'] ?? null],
|
||||
['id', 'nombre']);
|
||||
check('el motivo sale del catálogo del ERP',
|
||||
($campos['novedad_id']['source_endpoint_key'] ?? null), 'novedades_ausentismo_dn');
|
||||
check('ambas fechas validan formato',
|
||||
[$campos['fecha_inicial']['other_validate'] ?? null, $campos['fecha_final']['other_validate'] ?? null],
|
||||
['date', 'date']);
|
||||
check('pide confirmación antes de enviar', $aus['confirm'] ?? false, true);
|
||||
|
||||
// Los endpoints que usa deben estar dados de alta
|
||||
preg_match_all("/'key' => '([^']+)'/", substr($seed, $end), $mEp);
|
||||
$eps = array_flip($mEp[1]);
|
||||
foreach (['ausentismos_up', 'empleados_buscar_dn', 'novedades_ausentismo_dn'] as $k) {
|
||||
check("endpoint {$k} registrado", isset($eps[$k]), true);
|
||||
}
|
||||
|
||||
// Accesible para quienes reportan (cat 1 y cat 3), no para cat 2
|
||||
$enMenu = function (array $config, string $cat, string $id): bool {
|
||||
$pt = $config['per_type'][$cat] ?? [];
|
||||
$menus = array_merge($config['menus'] ?? [], $pt['menus'] ?? []);
|
||||
foreach ($menus as $m) {
|
||||
foreach ($m['sections'] ?? [] as $sec) {
|
||||
if (in_array($id, array_column($sec['rows'] ?? [], 'id'), true)) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
check('cat 1 lo ve en su menú', $enMenu($config, '1', 'registrar_ausentismo'), true);
|
||||
check('cat 3 lo ve en enviar información', $enMenu($config, '3', 'registrar_ausentismo'), 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