Files
whatsapp/api/save_menu.php
T
2026-01-12 22:42:41 -05:00

145 lines
4.6 KiB
PHP

<?php
/**
* API - Guardar menú
* Fecha: 12 de enero de 2026 - Actualizado para nueva estructura
*/
require_once '../config/config.php';
// Verificar autenticación
requireAuthentication();
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => 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()
]);
}
?>