From 060041c855485e7331bfe6bd86d8593be17cdd0f Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 14 Jul 2026 15:36:20 -0500 Subject: [PATCH] fix: apply-menus hace merge en vez de reemplazar config completo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- scripts/apply-menus.php | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/scripts/apply-menus.php b/scripts/apply-menus.php index 14b9870..3773e05 100644 --- a/scripts/apply-menus.php +++ b/scripts/apply-menus.php @@ -167,6 +167,10 @@ $menuConfig = [ ], ]; +// 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; @@ -179,27 +183,43 @@ foreach ($companies as $company) { } } - $preserveKeys = ['greeting', 'fallback', 'ai_prompt', 'ai_model', 'ai_temperature', 'ai_provider', 'approval_webhook', 'ignore_prefixes', 'ai_max_tokens']; - foreach ($preserveKeys as $key) { - if (array_key_exists($key, $existing)) { - $menuConfig[$key] = $existing[$key]; + // 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]; } } - if (!isset($menuConfig['greeting'])) { - $menuConfig['greeting'] = '¡Bienvenido! Escribe *menu* para ver las opciones disponibles.'; + // Aplicar defaults solo si no existen + if (!isset($merged['greeting'])) { + $merged['greeting'] = '¡Bienvenido! Escribe *menu* para ver las opciones disponibles.'; } - if (!isset($menuConfig['fallback'])) { - $menuConfig['fallback'] = 'No entendí. 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($menuConfig, JSON_UNESCAPED_UNICODE), + 'config_json' => json_encode($merged, JSON_UNESCAPED_UNICODE), ]); $name = $company['display_name'] ?: $company['name']; - echo "✔ {$name} actualizada\n"; + $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++; }