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>
This commit is contained in:
Lizandro Guarnizo
2026-07-14 15:36:20 -05:00
co-authored by Claude Sonnet 4.6
parent 976f61b682
commit 060041c855
+30 -10
View File
@@ -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++;
}