Files
bot_palmas/scripts/apply-menus.php
T
Lizandro GuarnizoandClaude Sonnet 4.6 060041c855 fix: apply-menus hace merge en vez de reemplazar config completo
Antes sobreescribía todo el config_json con solo los flows base,
borrando nlu, whisper_*, gemini_*, flows custom y menus custom.
Ahora solo actualiza los flows/menus definidos en el script y
preserva todo lo demás que tenga la empresa en la BD.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 15:36:20 -05:00

227 lines
10 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/../config/env.php';
require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../services/CompanyRepository.php';
$menuConfig = [
'commands' => [
'menu' => 'show_main_menu',
'informes' => 'descargar_informes',
'info' => 'recibir_info',
'inicio' => 'show_main_menu',
'volver' => 'show_main_menu',
],
'menus' => [
'show_main_menu' => [
'type' => 'list',
'header' => 'Menú Principal',
'body' => 'Selecciona una opción:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'recibir_info', 'title' => 'Recibir Información', 'description' => 'Obtén información útil'],
['id' => 'descargar_informes', 'title' => 'Descargar Informes', 'description' => 'Accede a tus informes'],
['id' => 'menu_mixto', 'title' => 'Menú Mixto', 'description' => 'Combina ambas opciones'],
],
],
],
],
'submenu_informes' => [
'type' => 'list',
'header' => 'Informes',
'body' => 'Selecciona el tipo de informe:',
'footer' => 'Palmas360',
'button' => 'Ver informes',
'sections' => [
[
'title' => 'Tipo de Informe',
'rows' => [
['id' => 'submenu_ciclos', 'title' => 'Ciclos', 'description' => 'Informes de ciclos'],
['id' => 'submenu_produccion', 'title' => 'Producción', 'description' => 'Informes de producción'],
['id' => 'submenu_mantenimiento_fecha', 'title' => 'Ciclos Mtto. Fecha', 'description' => 'Ciclos de mantenimiento a la fecha'],
],
],
],
],
'submenu_ciclos' => [
'type' => 'list',
'header' => 'Ciclos',
'body' => 'Selecciona tipo de ciclo:',
'footer' => 'Palmas360',
'button' => 'Ver ciclos',
'sections' => [
[
'title' => 'Ciclos',
'rows' => [
['id' => 'submenu_ciclos_cosecha', 'title' => 'Ciclos Cosecha', 'description' => 'Ciclos de cosecha'],
['id' => 'submenu_ciclos_sanidad', 'title' => 'Ciclos Sanidad', 'description' => 'Ciclos de sanidad'],
['id' => 'submenu_ciclo_cosecha', 'title' => 'Ciclo de Cosecha','description' => 'Día o histórico de cosecha'],
],
],
],
],
'submenu_ciclo_cosecha' => [
'type' => 'button',
'body' => 'Selecciona una opción:',
'buttons' => [
['id' => 'ciclo_cosecha_dia', 'title' => 'Día Ciclo Cosecha'],
['id' => 'ciclo_cosecha_historico', 'title' => 'Histórico 30 Días'],
],
],
'menu_mixto' => [
'type' => 'button',
'body' => '¿Qué deseas hacer?',
'buttons' => [
['id' => 'recibir_info', 'title' => 'Recibir Información'],
['id' => 'descargar_informes', 'title' => 'Descargar Informes'],
],
],
],
'flows' => [
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2'],
'recibir_info' => ['type' => 'function', 'function' => 'forward_to_ai'],
'descargar_informes' => ['type' => 'menu', 'menu' => 'submenu_informes'],
'menu_mixto' => ['type' => 'menu', 'menu' => 'menu_mixto'],
'submenu_ciclos' => ['type' => 'menu', 'menu' => 'submenu_ciclos'],
'submenu_produccion' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'produccion_dn', 'filename' => 'reporte_produccion.xlsx', 'caption' => 'Reporte de producción']],
'submenu_mantenimiento_fecha' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'mantenimiento_dn', 'filename' => 'reporte_mantenimiento.xlsx', 'caption' => 'Ciclos de mantenimiento a la fecha']],
'submenu_ciclos_cosecha' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'cosecha_dn', 'filename' => 'reporte_ciclos_cosecha.xlsx', 'caption' => 'Ciclos de cosecha']],
'submenu_ciclos_sanidad' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'sanidad_dn', 'filename' => 'reporte_ciclos_sanidad.xlsx', 'caption' => 'Ciclos de sanidad']],
'submenu_ciclo_cosecha' => ['type' => 'menu', 'menu' => 'submenu_ciclo_cosecha'],
'ciclo_cosecha_dia' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'cosecha_dn', 'filename' => 'ciclo_cosecha_hoy.xlsx', 'caption' => 'Ciclo de cosecha del día de hoy', 'date_mode' => 'today']],
'ciclo_cosecha_historico' => ['type' => 'function', 'function' => 'api_report', 'params' => ['endpoint_key' => 'cosecha_dn', 'filename' => 'ciclo_cosecha_30dias.xlsx', 'caption' => 'Histórico ciclos de cosecha últimos 30 días', 'date_mode' => 'last_30']],
],
'per_type' => [
'3' => [
'greeting_flow' => 'show_main_menu',
'fallback_flow' => 'show_main_menu',
'greeting' => null,
'fallback' => null,
],
'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' => 'Bienvenido',
'body' => '¿Qué deseas hacer?',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'recibir_info_cat1', 'title' => 'Recibir Información', 'description' => 'Información útil para ti'],
],
],
],
],
],
'flows' => [
'show_menu_cat1' => ['type' => 'menu', 'menu' => 'show_menu_cat1'],
'recibir_info_cat1' => ['type' => 'function', 'function' => 'forward_to_ai'],
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat1'],
],
],
'2' => [
'greeting_flow' => 'show_menu_cat2',
'fallback_flow' => 'show_menu_cat2',
'greeting' => null,
'fallback' => null,
'commands' => [
'menu' => 'show_menu_cat2',
],
'menus' => [
'show_menu_cat2' => [
'type' => 'list',
'header' => 'Menú',
'body' => 'Selecciona una opción:',
'footer' => 'Palmas360',
'button' => 'Ver opciones',
'sections' => [
[
'title' => 'Opciones',
'rows' => [
['id' => 'descargar_informes', 'title' => 'Descargar Informes', 'description' => 'Accede a tus informes'],
],
],
],
],
],
'flows' => [
'show_menu_cat2' => ['type' => 'menu', 'menu' => 'show_menu_cat2'],
'show_main_menu' => ['type' => 'menu', 'menu' => 'show_menu_cat2'],
],
],
],
];
// Claves de flows y menus definidas en este script (las únicas que se actualizan)
$baseFlowKeys = array_keys($menuConfig['flows']);
$baseMenuKeys = array_keys($menuConfig['menus']);
$companies = CompanyRepository::findAll(true);
$count = 0;
foreach ($companies as $company) {
$existing = [];
if (!empty($company['config_json'])) {
$decoded = json_decode($company['config_json'], true);
if (is_array($decoded)) {
$existing = $decoded;
}
}
// Partir del config existente para preservar TODO lo custom (nlu, whisper_*, gemini_*, etc.)
$merged = $existing;
// Actualizar SOLO los flows base definidos aquí; los flows custom se preservan
foreach ($menuConfig['flows'] as $key => $flow) {
$merged['flows'][$key] = $flow;
}
// Actualizar SOLO los menus base; los menus custom se preservan
foreach ($menuConfig['menus'] as $key => $menu) {
$merged['menus'][$key] = $menu;
}
// Actualizar commands, per_type y otros campos estructurales del template
foreach (['commands', 'per_type'] as $structKey) {
if (isset($menuConfig[$structKey])) {
$merged[$structKey] = $menuConfig[$structKey];
}
}
// Aplicar defaults solo si no existen
if (!isset($merged['greeting'])) {
$merged['greeting'] = '¡Bienvenido! Escribe *menu* para ver las opciones disponibles.';
}
if (!isset($merged['fallback'])) {
$merged['fallback'] = 'No entendí. Escribe *menu* para ver las opciones disponibles.';
}
CompanyRepository::save([
'id' => (int)$company['id'],
'config_json' => json_encode($merged, JSON_UNESCAPED_UNICODE),
]);
$name = $company['display_name'] ?: $company['name'];
$customFlows = count(array_diff(array_keys($merged['flows'] ?? []), $baseFlowKeys));
$customMenus = count(array_diff(array_keys($merged['menus'] ?? []), $baseMenuKeys));
echo "✔ {$name} actualizada (preservados: {$customFlows} flows custom, {$customMenus} menus custom)\n";
$count++;
}
echo "\n{$count} empresas actualizadas con los nuevos menús.\n";