false, 'error' => 'Método no permitido']); exit; } try { $input = json_decode(file_get_contents('php://input'), true); if (!$input || !isset($input['name'])) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Nombre del menú es requerido']); exit; } $db = Database::getInstance(); // Iniciar transacción $db->beginTransaction(); try { // Verificar estructura de tabla antes de insertar $tableStructure = $db->fetchAll("DESCRIBE menus"); $availableColumns = array_column($tableStructure, 'Field'); error_log("Columnas disponibles en tabla menus: " . json_encode($availableColumns)); // Adaptar datos a la estructura real de la tabla $menuData = []; // Campos básicos que deberían existir if (in_array('name', $availableColumns)) { $menuData['name'] = $input['menu_key'] ?? $input['name']; // Usar menu_key como name } if (in_array('title', $availableColumns)) { $menuData['title'] = $input['name'] ?? 'Nuevo Menú'; // Usar name como title } if (in_array('description', $availableColumns)) { $menuData['description'] = $input['description'] ?? ''; } if (in_array('parent_id', $availableColumns)) { $menuData['parent_id'] = empty($input['parent_id']) ? null : (int)$input['parent_id']; } if (in_array('is_root', $availableColumns)) { $menuData['is_root'] = empty($input['parent_id']) ? 1 : 0; } if (in_array('is_active', $availableColumns)) { $menuData['is_active'] = ($input['status'] === 'active') ? 1 : 0; } if (in_array('order_position', $availableColumns)) { // Obtener próxima posición $maxOrder = $db->fetch("SELECT COALESCE(MAX(order_position), 0) as max_order FROM menus"); $menuData['order_position'] = ($maxOrder['max_order'] ?? 0) + 1; } if (in_array('created_at', $availableColumns)) { $menuData['created_at'] = date('Y-m-d H:i:s'); } if (in_array('updated_at', $availableColumns)) { $menuData['updated_at'] = date('Y-m-d H:i:s'); } $menuId = $db->insert('menus', $menuData); if (!$menuId) { throw new Exception('Error insertando menú'); } // Procesar opciones si las hay $optionsCount = 0; if (isset($input['options']) && is_array($input['options'])) { foreach ($input['options'] as $option) { if (!empty($option['key']) && !empty($option['text'])) { $optionData = [ 'menu_id' => $menuId, 'option_key' => $option['key'], 'option_text' => $option['text'], 'option_action' => $option['action'] ?? 'message', 'option_value' => $option['value'] ?? '', 'order_index' => $option['order_index'] ?? $optionsCount + 1, 'is_active' => true, 'created_at' => date('Y-m-d H:i:s') ]; $optionId = $db->insert('menu_options', $optionData); if ($optionId) { $optionsCount++; } } } } // Actualizar contador de opciones $db->execute("UPDATE menus SET options_count = :count WHERE id = :id", [ 'count' => $optionsCount, 'id' => $menuId ]); $db->commit(); echo json_encode([ 'success' => true, 'message' => 'Menú guardado correctamente', 'menu_id' => $menuId, 'options_created' => $optionsCount ]); } catch (Exception $e) { $db->rollback(); throw $e; } } catch (Exception $e) { error_log("Error in save_menu.php: " . $e->getMessage()); http_response_code(500); echo json_encode([ 'success' => false, 'error' => 'Error interno del servidor', 'debug' => $e->getMessage() ]); } ?>