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:
Lizandro Guarnizo
2026-08-04 19:37:16 -05:00
co-authored by Claude Sonnet 4.6
parent 0bb1d3447e
commit 0e72aa3d5a
3 changed files with 160 additions and 5 deletions
+62 -2
View File
@@ -228,7 +228,8 @@ $configJson = [
[
'title' => 'Opciones',
'rows' => [
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Ciclo cosecha', 'description' => 'Subir ciclo de cosecha'],
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Ciclo cosecha', 'description' => 'Subir ciclo de cosecha'],
['id' => 'registrar_ausentismo', 'title' => '👥 Ausentismo', 'description' => 'Registrar falta, incapacidad o permiso'],
],
],
],
@@ -395,6 +396,58 @@ $configJson = [
'params'=>['endpoint_key'=>'mantenimiento_todos_bot_dn','date_mode'=>'today','filename'=>'mantenimiento_todos.pdf','caption'=>'Mantenimiento — todos los lotes'],
],
// ── Carga de datos (POST) — Fase 1 ──────────────────────────────────
// Palmas360 decide si auto-aprueba o encola para revisión; el bot solo
// envía. Campos opcionales del contrato (eps, diagnostico_id) quedan
// fuera hasta confirmar qué novedades son incapacidad.
'registrar_ausentismo' => [
'type' => 'collect_and_post',
'endpoint_key' => 'ausentismos_up',
'header' => '👥 Registrar ausentismo',
'confirm' => true,
'success_text' => '✅ Ausentismo enviado a Palmas360.',
'back' => 'enviar_informacion',
'nlu_description' => 'Registrar un ausentismo, incapacidad o permiso de un trabajador',
'fields' => [
[
'key' => 'empleado_id',
'label' => 'Trabajador',
'type' => 'lookup',
'prompt' => '👤 Escribe el nombre o documento del trabajador:',
'lookup_endpoint_key' => 'empleados_buscar_dn',
'lookup_param' => 'filtro',
'value_field' => 'id',
'display_field' => 'nombre',
'not_found_text' => '⚠️ No encontré ese trabajador. Escribe el nombre de nuevo:',
],
[
'key' => 'novedad_id',
'label' => 'Motivo',
'type' => 'select',
'prompt' => '¿Cuál es el motivo del ausentismo?',
'source_endpoint_key' => 'novedades_ausentismo_dn',
'value_field' => 'id',
'label_field' => 'nombre',
],
[
'key' => 'fecha_inicial',
'label' => 'Desde',
'type' => 'date_quick',
'prompt' => '📅 ¿Desde qué fecha?',
'other_validate' => 'date',
'other_prompt' => 'Escribe la fecha de inicio (YYYY-MM-DD):',
],
[
'key' => 'fecha_final',
'label' => 'Hasta',
'type' => 'date_quick',
'prompt' => '📅 ¿Hasta qué fecha? (si es un solo día, elige la misma)',
'other_validate' => 'date',
'other_prompt' => 'Escribe la fecha final (YYYY-MM-DD):',
],
],
],
// Upload
'enviar_informacion' => ['type' => 'menu', 'menu' => 'submenu_subir_ciclos', 'nlu_skip' => true, 'back' => 'show_main_menu'],
'subir_ciclo_cosecha' => ['type' => 'function', 'function' => 'upload_ciclo', 'nlu_description' => 'Subir o enviar un ciclo de cosecha', 'params' => ['ciclo' => 'cosecha']],
@@ -425,7 +478,8 @@ $configJson = [
[
'title' => 'Opciones',
'rows' => [
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Subir cosecha', 'description' => 'Enviar ciclo de cosecha'],
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Subir cosecha', 'description' => 'Enviar ciclo de cosecha'],
['id' => 'registrar_ausentismo', 'title' => '👥 Ausentismo', 'description' => 'Registrar falta, incapacidad o permiso'],
],
],
],
@@ -512,6 +566,12 @@ $endpoints = [
['key' => 'tratamiento_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=tratamiento_historico_bot&finca_id={finca_id}'],
['key' => 'fincas_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=fincas'],
['key' => 'numeros_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=whatsapp_numeros&estado=1'],
// ── Carga de datos (POST) — Fase 1: Ausentismo ──────────────────────────
// El lookup agrega &filtro=<texto> a esta URL; estado=1 restringe a activos.
['key' => 'empleados_buscar_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=empleados&estado=1&items=10'],
['key' => 'novedades_ausentismo_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=novedades_ausentismo_dn'],
['key' => 'ausentismos_up', 'dir' => 'upload', 'url' => $BASE . '?peticion=ausentismos_up'],
// Todos los lotes (PDF) por ciclo
['key' => 'cosecha_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_cosecha_dn&finca_id={finca_id}'],
['key' => 'polinizacion_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_polinizacion_dn&finca_id={finca_id}'],