Files
bot_palmas/setup/seed_palmas.php
T
Lizandro GuarnizoandClaude Sonnet 4.6 a64421c527 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>
2026-08-01 10:55:55 -05:00

598 lines
37 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
require_once dirname(__DIR__) . '/config/env.php';
require_once dirname(__DIR__) . '/config/db.php';
$db = db();
// ─── CONFIG JSON completo (Company 2 y 3 comparten la misma base) ────────────
$configJson = [
'greeting' => '¡Bienvenido a Palmas360! Escribe *menu* para ver las opciones disponibles.',
'fallback' => 'No entendí. Escribe *menu* para ver las opciones disponibles.',
'nlu_enabled' => true,
'commands' => [
// Al menú principal
'menu' => 'show_main_menu',
'inicio' => 'show_main_menu',
'salir' => 'show_main_menu',
'cancelar' => 'show_main_menu',
// Un nivel arriba (__back lo resuelve con el mapa 'back' del nodo actual)
'atras' => '__back',
'volver' => '__back',
'regresar' => '__back',
// Atajos
'informes' => 'descargar_informes',
'info' => 'enviar_informacion',
'finca' => 'reset_finca',
'cambiar finca' => 'reset_finca',
],
// ── Menus globales ──────────────────────────────────────────────────────
'menus' => [
// Menú modo trabajo (para per_type=3 tras seleccionar finca)
'menu_modo_trabajo' => [
'type' => 'list',
'header' => '🌴 Palmas360',
'body' => '¿Qué deseas hacer?',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'descargar_informes', 'title' => '📥 Descargar informes', 'description' => 'Ciclos, Producción, Ausentismos'],
['id' => 'enviar_informacion', 'title' => '📤 Enviar información', 'description' => 'Subir ciclos y datos'],
],
],
],
],
// Menú cat2 (descargar informes) — accesible globalmente
'show_menu_cat2' => [
'type' => 'list',
'header' => '📋 Informes',
'body' => '¿Qué informe deseas?',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Informes',
'rows' => [
['id' => 'submenu_produccion', 'title' => '🌿 Producción', 'description' => 'Informes de producción'],
['id' => 'submenu_ciclos', 'title' => '🔄 Ciclos', 'description' => 'Ciclos de campo'],
['id' => 'submenu_ausentismos', 'title' => '👥 Ausentismos', 'description' => 'Faltas y novedades'],
],
],
],
],
// Submenú producción
'submenu_produccion' => [
'type' => 'list',
'header' => '🌿 Producción',
'body' => 'Selecciona el informe:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Producción',
'rows' => [
['id' => 'produccion_total', 'title' => '📊 Totales facturados', 'description' => 'Resumen y PDF del año'],
['id' => 'produccion_lotes', 'title' => '📋 Por lotes (Excel)', 'description' => 'Detalle por lote'],
],
],
],
],
// Submenú ciclos
'submenu_ciclos' => [
'type' => 'list',
'header' => '🔄 Ciclos',
'body' => 'Selecciona el tipo de ciclo:',
'footer' => 'Palmas360',
'button' => 'Ver ciclos',
'sections' => [
[
'title' => 'Ciclos',
'rows' => [
['id' => 'ciclo_cosecha', 'title' => '🌾 Cosecha', 'description' => 'Ciclos de cosecha'],
['id' => 'ciclo_polinizacion', 'title' => '🌸 Polinización', 'description' => 'Ciclos de polinización'],
['id' => 'submenu_ciclos_sanidad','title' => '🧪 Sanidad', 'description' => 'Plagas, Censo, Palmarum, Tratamientos'],
['id' => 'ciclo_mantenimiento', 'title' => '🔧 Mantenimiento', 'description' => 'Ciclos de mantenimiento'],
],
],
],
],
// Sub-menús por ciclo (3 botones: más largos / todos / histórico)
'submenu_ciclo_cosecha' => ['type'=>'button','body'=>'Ciclos de Cosecha — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_cosecha_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_cosecha_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_cosecha_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_polinizacion' => ['type'=>'button','body'=>'Ciclos de Polinización — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_polinizacion_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_polinizacion_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_polinizacion_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_plagas' => ['type'=>'button','body'=>'Ciclos de Plagas — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_plagas_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_plagas_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_plagas_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_censo' => ['type'=>'button','body'=>'Ciclos de Censo — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_censo_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_censo_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_censo_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_palm' => ['type'=>'button','body'=>'Ciclos de Palmarum — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_palm_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_palm_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_palm_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_tratamiento' => ['type'=>'button','body'=>'Ciclos de Tratamientos — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_tratamiento_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_tratamiento_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'ciclo_tratamiento_historico','title'=>'📅 Histórico 30d'],
]],
'submenu_ciclo_mantenimiento' => ['type'=>'button','body'=>'Ciclos de Mantenimiento — ¿Qué deseas ver?','buttons'=>[
['id'=>'ciclo_mantenimiento_top', 'title'=>'🏆 Más largos'],
['id'=>'ciclo_mantenimiento_todos', 'title'=>'📋 Todos los lotes'],
['id'=>'reset_grupo_mant', 'title'=>'🔄 Otro grupo'],
]],
// Submenú sanidad vegetal (orden: Censo, Plagas, Rincofurus, Tratamiento)
'submenu_ciclos_sanidad' => [
'type' => 'list',
'header' => '🧪 Sanidad Vegetal',
'body' => 'Selecciona el ciclo de sanidad:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Sanidad',
'rows' => [
['id' => 'ciclo_censo', 'title' => '📝 Censo', 'description' => 'Ciclos de censo'],
['id' => 'ciclo_plagas', 'title' => '🐛 Plagas', 'description' => 'Ciclos de plagas'],
['id' => 'ciclo_palm', 'title' => '🌴 Palmarum', 'description' => 'Rhynchophorus Palmarum'],
['id' => 'ciclo_tratamiento', 'title' => '💊 Tratamiento', 'description' => 'Ciclos de tratamientos'],
],
],
],
],
// Submenú ausentismos
'submenu_ausentismos' => [
'type' => 'list',
'header' => '👥 Ausentismos',
'body' => 'Selecciona el período:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Período',
'rows' => [
['id' => 'ausentismos_hoy', 'title' => '📅 Hoy', 'description' => '¿Quién faltó hoy?'],
['id' => 'ausentismos_semana', 'title' => '📆 Esta semana', 'description' => '¿Quién faltó esta semana?'],
['id' => 'ausentismos_mes', 'title' => '📋 Mes (PDF)', 'description' => 'Reporte mensual PDF'],
],
],
],
],
// Submenú subir ciclos (para per_type=3)
'submenu_subir_ciclos' => [
'type' => 'list',
'header' => '📤 Enviar información',
'body' => 'Selecciona qué deseas enviar:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Ciclo cosecha', 'description' => 'Subir ciclo de cosecha'],
],
],
],
],
],
// ── Flows globales ──────────────────────────────────────────────────────
'flows' => [
// Selección de finca (dynamic_list — guarda finca_id en meta)
'ask_finca' => [
'type' => 'dynamic_list',
'source_endpoint_key' => 'fincas_dn',
'value_field' => 'id',
'label_field' => 'label',
'header' => '🌴 Palmas360',
'body' => '¿En qué finca trabajas?',
'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',
],
// Acción NLU: limpiar finca y volver a ask_finca
'reset_finca' => [
'type' => 'function',
'function' => 'reset_finca',
'nlu_description' => 'Cambiar de finca o seleccionar una finca diferente',
],
// Vuelve a pedir el grupo de mantenimiento (el grupo persiste entre informes)
'reset_grupo_mant' => [
'type' => 'function',
'function' => 'reset_grupo_mant',
'nlu_description' => 'Cambiar el grupo de mantenimiento (plateo, corona, poda, etc.)',
],
// Producción (texto del mes + PDF encadenado)
'produccion_total' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Producción total facturada del mes actual con PDF del año', 'params' => [
'endpoint_key' => 'produccion_total_bot_dn',
'date_mode' => 'current_month',
'next_endpoint_key' => 'produccion_total_pdf_bot_dn',
'next_caption' => '📊 Producción del año (PDF)',
'next_filename' => 'produccion_año.pdf',
]],
'produccion_lotes' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Producción detallada por lotes en Excel', 'params' => [
'endpoint_key' => 'produccion_lotes_bot_dn',
'filename' => 'produccion_lotes.xlsx',
'caption' => 'Producción por lotes del año',
]],
// Ausentismos
'ausentismos_hoy' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Ausentismos de hoy, quién faltó hoy', 'params' => [
'endpoint_key' => 'ausentismos_bot_texto_dn',
'date_mode' => 'today',
]],
'ausentismos_semana' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Ausentismos de esta semana', 'params' => [
'endpoint_key' => 'ausentismos_bot_texto_dn',
'date_mode' => 'last_7',
]],
'ausentismos_mes' => ['type' => 'function', 'function' => 'api_report', 'nlu_description' => 'Reporte PDF de ausentismos del mes', 'params' => [
'endpoint_key' => 'ausentismos_bot_pdf_dn',
'date_mode' => 'current_month',
'filename' => 'ausentismos_mes.pdf',
'caption' => 'Ausentismos del mes',
]],
// Menus de sección (nlu_skip: navegación interna, no exponer al NLU)
// 'back' = a dónde sube el comando "atrás" desde cada nivel
'submenu_produccion' => ['type' => 'menu', 'menu' => 'submenu_produccion', 'nlu_skip' => true, 'back' => 'show_main_menu'],
'submenu_ciclos' => ['type' => 'menu', 'menu' => 'submenu_ciclos', 'nlu_skip' => true, 'back' => 'show_main_menu'],
'submenu_ciclos_sanidad' => ['type' => 'menu', 'menu' => 'submenu_ciclos_sanidad', 'nlu_skip' => true, 'back' => 'submenu_ciclos'],
'submenu_ausentismos' => ['type' => 'menu', 'menu' => 'submenu_ausentismos', 'nlu_skip' => true, 'back' => 'show_main_menu'],
// Ciclos — cada uno abre un sub-menú de 3 opciones
'ciclo_cosecha' => ['type' => 'menu', 'menu' => 'submenu_ciclo_cosecha', 'back' => 'submenu_ciclos', 'nlu_description' => 'Ver ciclos de cosecha (lotes más largos o todos)'],
'ciclo_polinizacion' => ['type' => 'menu', 'menu' => 'submenu_ciclo_polinizacion', 'back' => 'submenu_ciclos', 'nlu_description' => 'Ver ciclos de polinización'],
'ciclo_plagas' => ['type' => 'menu', 'menu' => 'submenu_ciclo_plagas', 'back' => 'submenu_ciclos_sanidad', 'nlu_description' => 'Ver ciclos de plagas'],
'ciclo_censo' => ['type' => 'menu', 'menu' => 'submenu_ciclo_censo', 'back' => 'submenu_ciclos_sanidad', 'nlu_description' => 'Ver ciclos de censo'],
'ciclo_palm' => ['type' => 'menu', 'menu' => 'submenu_ciclo_palm', 'back' => 'submenu_ciclos_sanidad', 'nlu_description' => 'Ver ciclos de Palmarum (Rhynchophorus)'],
'ciclo_tratamiento' => ['type' => 'menu', 'menu' => 'submenu_ciclo_tratamiento', 'back' => 'submenu_ciclos_sanidad', 'nlu_description' => 'Ver ciclos de tratamientos'],
// Sub-opciones: cosecha
'ciclo_cosecha_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de cosecha con ciclos más largos','params'=>['endpoint_key'=>'cosecha_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_cosecha_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de cosecha todos los lotes','params'=>['endpoint_key'=>'cosecha_todos_dn','date_mode'=>'today','filename'=>'ciclos_cosecha.pdf','caption'=>'Ciclos de Cosecha — todos los lotes']],
'ciclo_cosecha_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de cosecha últimos 30 días','params'=>['endpoint_key'=>'cosecha_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_cosecha.pdf','caption'=>'Histórico Cosecha — últimos 30 días']],
// Sub-opciones: polinizacion
'ciclo_polinizacion_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de polinización con ciclos más largos','params'=>['endpoint_key'=>'polinizacion_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_polinizacion_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de polinización todos los lotes','params'=>['endpoint_key'=>'polinizacion_todos_dn','date_mode'=>'today','filename'=>'ciclos_polinizacion.pdf','caption'=>'Ciclos de Polinización — todos los lotes']],
'ciclo_polinizacion_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de polinización últimos 30 días','params'=>['endpoint_key'=>'polinizacion_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_polinizacion.pdf','caption'=>'Histórico Polinización — últimos 30 días']],
// Sub-opciones: plagas
'ciclo_plagas_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de plagas con ciclos más largos','params'=>['endpoint_key'=>'plagas_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_plagas_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de plagas todos los lotes','params'=>['endpoint_key'=>'plagas_todos_dn','date_mode'=>'today','filename'=>'ciclos_plagas.pdf','caption'=>'Ciclos de Plagas — todos los lotes']],
'ciclo_plagas_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de plagas últimos 30 días','params'=>['endpoint_key'=>'plagas_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_plagas.pdf','caption'=>'Histórico Plagas — últimos 30 días']],
// Sub-opciones: censo
'ciclo_censo_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de censo con ciclos más largos','params'=>['endpoint_key'=>'censo_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_censo_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de censo todos los lotes','params'=>['endpoint_key'=>'censo_todos_dn','date_mode'=>'today','filename'=>'ciclos_censo.pdf','caption'=>'Ciclos de Censo — todos los lotes']],
'ciclo_censo_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de censo últimos 30 días','params'=>['endpoint_key'=>'censo_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_censo.pdf','caption'=>'Histórico Censo — últimos 30 días']],
// Sub-opciones: palm
'ciclo_palm_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de Palmarum con ciclos más largos','params'=>['endpoint_key'=>'palm_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_palm_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de Palmarum todos los lotes','params'=>['endpoint_key'=>'palm_todos_dn','date_mode'=>'today','filename'=>'ciclos_palmarum.pdf','caption'=>'Ciclos de Palmarum — todos los lotes']],
'ciclo_palm_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de Palmarum últimos 30 días','params'=>['endpoint_key'=>'palm_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_palmarum.pdf','caption'=>'Histórico Palmarum — últimos 30 días']],
// Sub-opciones: tratamiento
'ciclo_tratamiento_top' => ['type'=>'function','function'=>'api_report','nlu_description'=>'Lotes de tratamiento con ciclos más largos','params'=>['endpoint_key'=>'tratamiento_top_texto_bot_dn','date_mode'=>'last_30']],
'ciclo_tratamiento_todos' => ['type'=>'function','function'=>'api_report','nlu_description'=>'PDF de ciclos de tratamientos todos los lotes','params'=>['endpoint_key'=>'tratamiento_todos_dn','date_mode'=>'today','filename'=>'ciclos_tratamientos.pdf','caption'=>'Ciclos de Tratamientos — todos los lotes']],
'ciclo_tratamiento_historico'=> ['type'=>'function','function'=>'api_report','nlu_description'=>'Histórico de tratamientos últimos 30 días','params'=>['endpoint_key'=>'tratamiento_historico_bot_dn','date_mode'=>'last_30','filename'=>'historico_tratamientos.pdf','caption'=>'Histórico Tratamientos — últimos 30 días']],
// ciclo_mantenimiento → selección dinámica de grupo (top3 + "Otro")
'ciclo_mantenimiento' => [
'type' => 'dynamic_list',
'source_endpoint_key' => 'mantenimiento_grupos_top3_dn',
// Con entities del NLU se busca en el catálogo completo: "plateo" puede
// no estar entre los 3 grupos más frecuentes.
'source_endpoint_key_all' => 'mantenimiento_grupos_all_dn',
'back' => 'submenu_ciclos',
'value_field' => 'id',
'label_field' => 'label',
'header' => '🔧 Mantenimiento',
'body' => 'Selecciona el grupo de mantenimiento:',
'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',
],
'select_grupo_mant_otros' => [
'type' => 'dynamic_list',
'source_endpoint_key' => 'mantenimiento_grupos_otros_dn',
'value_field' => 'id',
'label_field' => 'label',
'header' => '🔧 Mantenimiento',
'body' => 'Selecciona el grupo:',
'section_title' => 'Otros grupos',
'meta_group' => 'grupo_mant',
'meta_key' => 'grupo_id',
'next_node' => 'submenu_ciclo_mantenimiento',
'nlu_skip' => true,
],
// Sub-opciones: mantenimiento.
// requires/resolver: si el grupo aún no está elegido, el bot lo pide primero
// y al resolverlo vuelve a este informe (no al submenú).
'ciclo_mantenimiento_top' => [
'type'=>'function','function'=>'api_report',
'requires'=>['grupo_mant'=>'grupo_id'], 'resolver'=>'ciclo_mantenimiento',
'back'=>'submenu_ciclo_mantenimiento',
'nlu_description'=>'Lotes MÁS ATRASADOS de un grupo de mantenimiento — solo si pide los más largos o atrasados',
'params'=>['endpoint_key'=>'mantenimiento_top_texto_bot_dn','date_mode'=>'today'],
],
'ciclo_mantenimiento_todos' => [
'type'=>'function','function'=>'api_report',
'requires'=>['grupo_mant'=>'grupo_id'], 'resolver'=>'ciclo_mantenimiento',
'back'=>'submenu_ciclo_mantenimiento',
'nlu_description'=>'PDF con TODOS los lotes de un grupo de mantenimiento — solo si pide explícitamente todos',
'params'=>['endpoint_key'=>'mantenimiento_todos_bot_dn','date_mode'=>'today','filename'=>'mantenimiento_todos.pdf','caption'=>'Mantenimiento — todos los lotes'],
],
// 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']],
// Alias globales (nlu_skip: son alias de navegación)
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'nlu_skip' => true],
'descargar_informes' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'nlu_skip' => true, 'back' => 'show_main_menu'],
],
// ── Per-type config ─────────────────────────────────────────────────────
'per_type' => [
// Cat 1: solo reporta (envía info, no descarga)
'1' => [
'greeting_flow' => 'show_menu_cat1',
'fallback_flow' => 'show_menu_cat1',
'greeting' => null,
'fallback' => null,
'commands' => ['menu' => 'show_menu_cat1'],
'menus' => [
'show_menu_cat1' => [
'type' => 'list',
'header' => '🌴 Palmas360',
'body' => '¿Qué deseas hacer?',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'subir_ciclo_cosecha', 'title' => '🌾 Subir cosecha', 'description' => 'Enviar ciclo de cosecha'],
],
],
],
],
],
'flows' => [
'show_menu_cat1' => ['type' => 'menu', 'menu' => 'show_menu_cat1'],
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat1'],
'subir_ciclo_cosecha' => ['type' => 'function', 'function' => 'upload_ciclo', 'params' => ['ciclo' => 'cosecha']],
],
],
// Cat 2: solo descarga
'2' => [
'greeting_flow' => 'ask_finca',
'fallback_flow' => 'show_menu_cat2',
'greeting' => '',
'fallback' => null,
'commands' => ['menu' => 'show_menu_cat2'],
'menus' => [
'show_menu_cat2' => [
'type' => 'list',
'header' => '📋 Informes',
'body' => '¿Qué informe deseas?',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Informes',
'rows' => [
['id' => 'submenu_produccion', 'title' => '🌿 Producción', 'description' => 'Informes de producción'],
['id' => 'submenu_ciclos', 'title' => '🔄 Ciclos', 'description' => 'Ciclos de campo'],
['id' => 'submenu_ausentismos', 'title' => '👥 Ausentismos', 'description' => 'Faltas y novedades'],
],
],
],
],
],
'flows' => [
'show_menu_cat2' => ['type' => 'menu', 'menu' => 'show_menu_cat2'],
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2'],
'descargar_informes' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'back' => 'show_main_menu'],
],
],
// Cat 3: descarga + envío
'3' => [
'greeting_flow' => 'ask_finca',
'fallback_flow' => 'show_main_menu',
'greeting' => '',
'fallback' => null,
'commands' => ['menu' => 'show_main_menu'],
'menus' => [],
'flows' => [
'show_main_menu' => ['type' => 'menu', 'menu' => 'menu_modo_trabajo'],
'descargar_informes' => ['type' => 'menu', 'menu' => 'show_menu_cat2', 'back' => 'show_main_menu'],
'enviar_informacion' => ['type' => 'menu', 'menu' => 'submenu_subir_ciclos', 'back' => 'show_main_menu'],
],
],
],
];
// ─── Endpoints ─────────────────────────────────────────────────────────────────
$BASE = 'https://app.palmas360.com/rosablanca/php/controller/controller_api_externa.php';
$endpoints = [
['key' => 'produccion_total_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=produccion_total_bot&finca_id={finca_id}'],
['key' => 'produccion_total_pdf_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=produccion_total_pdf_bot&finca_id={finca_id}'],
['key' => 'produccion_lotes_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=produccion_lotes_bot&finca_id={finca_id}'],
['key' => 'ausentismos_bot_texto_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ausentismos_bot_texto'],
['key' => 'ausentismos_bot_pdf_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ausentismos_bot_pdf'],
['key' => 'cosecha_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=cosecha_top_texto_bot&finca_id={finca_id}'],
['key' => 'polinizacion_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=polinizacion_top_texto_bot&finca_id={finca_id}'],
['key' => 'censo_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=censo_top_texto_bot&finca_id={finca_id}'],
['key' => 'plagas_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=plagas_top_texto_bot&finca_id={finca_id}'],
['key' => 'palm_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=palm_top_texto_bot&finca_id={finca_id}'],
['key' => 'tratamiento_top_texto_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=tratamiento_top_texto_bot&finca_id={finca_id}'],
['key' => 'cosecha_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=cosecha_historico_bot&finca_id={finca_id}'],
['key' => 'polinizacion_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=polinizacion_historico_bot&finca_id={finca_id}'],
['key' => 'censo_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=censo_historico_bot&finca_id={finca_id}'],
['key' => 'plagas_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=plagas_historico_bot&finca_id={finca_id}'],
['key' => 'palm_historico_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=palm_historico_bot&finca_id={finca_id}'],
['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'],
// 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}'],
['key' => 'plagas_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_plagas_dn&finca_id={finca_id}'],
['key' => 'censo_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_censo_dn&finca_id={finca_id}'],
['key' => 'palm_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_palm_dn&finca_id={finca_id}'],
['key' => 'tratamiento_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_tratamientos_dn&finca_id={finca_id}'],
['key' => 'mantenimiento_grupos_top3_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=grupos_mantenimiento&limit=3'],
['key' => 'mantenimiento_grupos_otros_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=grupos_mantenimiento&limit=10&offset=3'],
['key' => 'mantenimiento_grupos_all_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=grupos_mantenimiento&limit=200'],
['key' => 'mantenimiento_top_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=mantenimiento_dn&top_lotes=10&grupo={grupo_id}&finca_id={finca_id}'],
['key' => 'mantenimiento_top_texto_bot_dn','dir' => 'download', 'url' => $BASE . '?peticion=mantenimiento_top_texto_bot&grupo={grupo_id}&finca_id={finca_id}'],
['key' => 'mantenimiento_todos_bot_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=mantenimiento_dn&grupo={grupo_id}&finca_id={finca_id}'],
];
// ─── Companies ─────────────────────────────────────────────────────────────────
$companies = [
[
'id' => 2,
'name' => 'rosablanca',
'display_name' => 'Rosa Blanca',
'phone_number_id' => '1168511569675820',
'display_phone' => '',
'api_base_url' => 'https://app.palmas360.com/rosablanca', // ERP, no el Graph API (WhatsAppSender lo tiene hardcodeado)
'api_key' => 'EAAqbNQQekwUBRm8ZAAfCvXZAsxcM1BTkiHjVJYeOfXYCg5t4qYtBL7ap2IdHGa1iXclZBO47gZBshYZBAlQRuUvgSib2Owh7gPnAWfNlHXZAT61ccElXoihuXuEuy0qLiB95tDhLMWPqoKYuDwAHCU78RQxoi1nzz1OsOY40EK7U2tKZBVuZABQZCJctZBrLK7rRiC7AZDZD',
'bot_type' => 'normal',
'requires_approval' => 0,
'is_active' => 1,
],
[
'id' => 3,
'name' => 'palmas360_test',
'display_name' => 'Palmas360 Test',
'phone_number_id' => '1168511569675820',
'display_phone' => '',
'api_base_url' => 'https://app.palmas360.com/rosablanca', // ERP, no el Graph API (WhatsAppSender lo tiene hardcodeado)
'api_key' => 'EAAqbNQQekwUBRm8ZAAfCvXZAsxcM1BTkiHjVJYeOfXYCg5t4qYtBL7ap2IdHGa1iXclZBO47gZBshYZBAlQRuUvgSib2Owh7gPnAWfNlHXZAT61ccElXoihuXuEuy0qLiB95tDhLMWPqoKYuDwAHCU78RQxoi1nzz1OsOY40EK7U2tKZBVuZABQZCJctZBrLK7rRiC7AZDZD',
'bot_type' => 'normal',
'requires_approval' => 0,
'is_active' => 1,
],
];
// ─── Insert / update companies ────────────────────────────────────────────────
/**
* El seed solo es dueño de la estructura del bot (menús, flujos, comandos...).
* Todo lo demás que viva en config_json —modelos de IA, temperatura, prompt,
* whisper— lo configura el admin y debe sobrevivir a cada corrida.
*/
function configPreservando(PDO $db, int $companyId, array $configSeed): string
{
$stmt = $db->prepare("SELECT config_json FROM companies WHERE id = ? LIMIT 1");
$stmt->execute([$companyId]);
$actual = json_decode((string)$stmt->fetchColumn(), true);
if (is_array($actual)) {
$conservadas = array_diff_key($actual, $configSeed);
if ($conservadas) {
$configSeed = array_merge($configSeed, $conservadas);
echo " ↳ conservadas: " . implode(', ', array_keys($conservadas)) . "\n";
}
}
return json_encode($configSeed, JSON_UNESCAPED_UNICODE);
}
$stmtCo = $db->prepare("
INSERT INTO companies (id, name, display_name, phone_number_id, display_phone, api_base_url, api_key, bot_type, requires_approval, is_active, config_json)
VALUES (:id, :name, :display_name, :phone_number_id, :display_phone, :api_base_url, :api_key, :bot_type, :requires_approval, :is_active, :config_json)
ON DUPLICATE KEY UPDATE
display_name = VALUES(display_name),
phone_number_id = VALUES(phone_number_id),
api_base_url = VALUES(api_base_url),
bot_type = VALUES(bot_type),
is_active = VALUES(is_active),
config_json = VALUES(config_json)
");
foreach ($companies as $co) {
echo "✔ Company {$co['id']} ({$co['display_name']})\n";
$cfg = configPreservando($db, (int)$co['id'], $configJson);
$stmtCo->execute([
':id' => $co['id'],
':name' => $co['name'],
':display_name' => $co['display_name'],
':phone_number_id' => $co['phone_number_id'],
':display_phone' => $co['display_phone'],
':api_base_url' => $co['api_base_url'],
':api_key' => $co['api_key'],
':bot_type' => $co['bot_type'],
':requires_approval'=> $co['requires_approval'],
':is_active' => $co['is_active'],
':config_json' => $cfg,
]);
}
// ─── Insert / update endpoints ────────────────────────────────────────────────
$stmtEp = $db->prepare("
INSERT INTO company_endpoints (company_id, endpoint_key, direction, url)
VALUES (:company_id, :endpoint_key, :direction, :url)
ON DUPLICATE KEY UPDATE url = VALUES(url), direction = VALUES(direction)
");
foreach ($companies as $co) {
foreach ($endpoints as $ep) {
$stmtEp->execute([
':company_id' => $co['id'],
':endpoint_key' => $ep['key'],
':direction' => $ep['dir'],
':url' => $ep['url'],
]);
}
echo "✔ " . count($endpoints) . " endpoints OK para company {$co['id']}\n";
}
echo "\n✅ Seed completo.\n";