canManage($request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot access.")]); } $tenantId = $request->tenantId(); $layouts = Layout::where('restaurant_id', $tenantId) ->orderBy('ordering', 'asc') ->get() ->toArray(); return $this->response([ 'success' => true, 'layouts' => $layouts ]); } /** * Get a specific layout with related data */ public function show(Request $request) { $user = Eva::make('user'); if (!$user->canManage($request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot access.")]); } $tenantId = $request->tenantId(); $layoutId = $request->layoutId; $layout = Layout::where('restaurant_id', $tenantId)->find($layoutId); if (!$layout) { return $this->response(['success' => false, 'error' => __eva("Layout not found.")]); } // Get related data for the layout editor $areas = Area::where('restaurant_id', $tenantId)->get()->toArray(); $tables = Table::where('restaurant_id', $tenantId)->get()->toArray(); $tags = TTag::where('restaurant_id', $tenantId)->get()->toArray(); $groups = TTagGroup::where('restaurant_id', $tenantId)->get()->toArray(); return $this->response([ 'success' => true, 'layout' => $layout->toArray(), 'areas' => $areas, 'tables' => $tables, 'tags' => $tags, 'groups' => $groups ]); } /** * Create a new layout */ public function create(Request $request) { $user = Eva::make('user'); if (!$user->canCreate('layouts', $request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot create layouts.")]); } $params = $request->params; $tenantId = $request->tenantId(); $layout = new Layout(); $layout->restaurant_id = $tenantId; $layout->name = $params['name'] ?? ''; $layout->description = $params['description'] ?? ''; $layout->image = $params['image'] ?? null; $layout->uploaded_image = $params['uploaded_image'] ?? null; $layout->settings = $params['settings'] ?? ['hotspots' => [], 'pricing' => []]; $layout->active = isset($params['active']) ? (bool)$params['active'] : true; $layout->ordering = isset($params['ordering']) ? (int)$params['ordering'] : 1; $layout->save(); return $this->response([ 'success' => true, 'layout' => $layout->toArray() ]); } /** * Update an existing layout */ public function update(Request $request) { $user = Eva::make('user'); if (!$user->canEdit('layouts', $request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot edit layouts.")]); } $tenantId = $request->tenantId(); $layoutId = $request->layoutId; $params = $request->params; $layout = Layout::where('restaurant_id', $tenantId)->find($layoutId); if (!$layout) { return $this->response(['success' => false, 'error' => __eva("Layout not found.")]); } // Update layout data if (isset($params['name'])) $layout->name = $params['name']; if (isset($params['description'])) $layout->description = $params['description']; if (isset($params['image'])) $layout->image = $params['image']; if (isset($params['uploaded_image'])) $layout->uploaded_image = $params['uploaded_image']; if (isset($params['settings'])) $layout->settings = $params['settings']; if (isset($params['active'])) $layout->active = (bool)$params['active']; if (isset($params['ordering'])) $layout->ordering = (int)$params['ordering']; $layout->save(); return $this->response([ 'success' => true, 'layout' => $layout->toArray() ]); } /** * Delete a layout */ public function delete(Request $request) { $user = Eva::make('user'); if (!$user->canDelete('layouts', $request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot delete layouts.")]); } $tenantId = $request->tenantId(); $layoutId = $request->layoutId; $layout = Layout::where('restaurant_id', $tenantId)->find($layoutId); if (!$layout) { return $this->response(['success' => false, 'error' => __eva("Layout not found.")]); } $layout->delete(); return $this->response([ 'success' => true, 'message' => __eva('Layout deleted successfully.') ]); } public function duplicate(Request $request) { try { $user = Eva::make('user'); if (!$user->canCreate('layouts', $request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot create layouts.")]); } $tenantId = $request->tenantId(); $layoutId = $request->layoutId; // Buscar el layout original usando el mismo patrón que los otros métodos $originalLayout = Layout::where('restaurant_id', $tenantId)->find($layoutId); if (!$originalLayout) { return $this->response([ 'success' => false, 'error' => __eva('Layout not found') ]); } // Generar un nombre único para la copia $baseName = $originalLayout->name; $newName = $baseName . ' Copy'; // Verificar si ya existe un layout con ese nombre $counter = 1; while (Layout::where('restaurant_id', $tenantId)->where('name', $newName)->first()) { $counter++; $newName = $baseName . ' Copy ' . $counter; } // Crear el nuevo layout usando el mismo patrón que el método create $newLayout = new Layout(); $newLayout->restaurant_id = $tenantId; $newLayout->name = $newName; $newLayout->description = $originalLayout->description; $newLayout->image = $originalLayout->image; $newLayout->uploaded_image = $originalLayout->uploaded_image; $newLayout->settings = $originalLayout->settings; $newLayout->active = false; // Por defecto desactivado para evitar conflictos $newLayout->ordering = $originalLayout->ordering + 1; // Siguiente posición $newLayout->save(); return $this->response([ 'success' => true, 'message' => __eva('Layout duplicated successfully'), 'layout' => $newLayout->toArray() ]); } catch (\Exception $e) { return $this->response([ 'success' => false, 'error' => __eva('Error duplicating layout: ' . $e->getMessage()) ]); } } /** * Reorder layouts */ public function reorder(Request $request) { $user = Eva::make('user'); if (!$user->canEdit('layouts', $request->tenant)){ return $this->response(['success' => false, 'error' => __eva("You cannot edit layouts.")]); } $tenantId = $request->tenantId(); $params = $request->params; // Expecting an array of layouts with id and ordering $layoutsData = $params['layouts'] ?? []; if (empty($layoutsData)) { return $this->response(['success' => false, 'error' => __eva("No layouts data provided.")]); } try { foreach ($layoutsData as $layoutData) { $layout = Layout::where('restaurant_id', $tenantId)->find($layoutData['id']); if ($layout) { $layout->ordering = (int)$layoutData['ordering']; $layout->save(); } } return $this->response([ 'success' => true, 'message' => __eva('Layouts reordered successfully') ]); } catch (\Exception $e) { return $this->response([ 'success' => false, 'error' => __eva('Error reordering layouts: ' . $e->getMessage()) ]); } } }