isValidUserCode($userCode)) { abort(404, 'Codice utente non valido'); } // Trova l'utente dal codice $user = $this->findUserByCode($userCode); if (!$user) { abort(404, 'Utente non trovato'); } // Verifica se l'utente loggato corrisponde al codice if (!Auth::check() || !$this->canAccessUserSpace(Auth::user(), $user)) { return redirect()->route('login')->with('error', 'Accesso non autorizzato'); } // Reindirizza alla dashboard appropriata return $this->redirectToDashboard($user, $userCode); } /** * Dashboard universale per utente specifico * * @param string $userCode * @return \Illuminate\View\View */ public function dashboard($userCode) { $user = $this->findUserByCode($userCode); if (!$user || !$this->canAccessUserSpace(Auth::user(), $user)) { abort(403, 'Accesso negato'); } // Determina il tipo di dashboard if ($user->hasRole('super-admin')) { return $this->superAdminDashboard($user, $userCode); } elseif ($user->hasRole(['admin', 'amministratore'])) { return $this->adminDashboard($user, $userCode); } elseif ($user->hasRole('condomino')) { return $this->condominoDashboard($user, $userCode); } abort(403, 'Ruolo non riconosciuto'); } /** * Valida il formato del codice utente * * @param string $code * @return bool */ private function isValidUserCode($code) { // Formato: 8 caratteri alfanumerici maiuscoli return preg_match('/^[A-Z0-9]{8}$/', $code); } /** * Trova utente dal codice * * @param string $code * @return User|null */ private function findUserByCode($code) { // Prima cerca negli amministratori $amministratore = Amministratore::where('codice_univoco', $code)->first(); if ($amministratore && $amministratore->user) { return $amministratore->user; } // Poi cerca nella tabella users (se ha campo codice) if (Schema::hasColumn('users', 'codice')) { return User::where('codice', $code)->first(); } return null; } /** * Verifica se l'utente può accedere allo spazio * * @param User $loggedUser * @param User $targetUser * @return bool */ private function canAccessUserSpace($loggedUser, $targetUser) { // L'utente può accedere al proprio spazio if ($loggedUser->id === $targetUser->id) { return true; } // Super-admin può accedere a qualsiasi spazio if ($loggedUser->hasRole('super-admin')) { return true; } // Altri casi di accesso autorizzato (es. impersonificazione) // TODO: Implementare logica impersonificazione return false; } /** * Reindirizza alla dashboard appropriata * * @param User $user * @param string $userCode * @return \Illuminate\Http\RedirectResponse */ private function redirectToDashboard($user, $userCode) { return redirect()->route('userspace.dashboard', ['userCode' => $userCode]); } /** * Dashboard Super Admin * * @param User $user * @param string $userCode * @return \Illuminate\View\View */ private function superAdminDashboard($user, $userCode) { $stats = [ 'amministratori_count' => Amministratore::count(), 'amministratori_attivi' => Amministratore::whereHas('user', function($q) { $q->where('email_verified_at', '!=', null); })->count(), 'database_count' => 0, // TODO: Implementare conteggio database 'sistema_versione' => config('app.version', '1.0.0'), 'uptime' => $this->getSystemUptime(), ]; return view('universal.dashboard.superadmin', compact('user', 'userCode', 'stats')); } /** * Dashboard Amministratore * * @param User $user * @param string $userCode * @return \Illuminate\View\View */ private function adminDashboard($user, $userCode) { $amministratore = $user->amministratore; $stats = [ 'stabili_count' => $amministratore ? $amministratore->stabili()->count() : 0, 'unita_count' => 0, // TODO: Conteggio unità immobiliari 'tickets_aperti' => 0, // TODO: Conteggio ticket aperti 'scadenze_prossime' => 0, // TODO: Conteggio scadenze ]; return view('universal.dashboard.admin', compact('user', 'userCode', 'amministratore', 'stats')); } /** * Dashboard Condomino * * @param User $user * @param string $userCode * @return \Illuminate\View\View */ private function condominoDashboard($user, $userCode) { $stats = [ 'unita_di_proprieta' => 0, // TODO: Implementare 'tickets_aperti' => 0, 'documenti_recenti' => 0, 'avvisi_non_letti' => 0, ]; return view('universal.dashboard.condomino', compact('user', 'userCode', 'stats')); } /** * Ottiene l'uptime del sistema * * @return string */ private function getSystemUptime() { if (PHP_OS_FAMILY === 'Linux') { $uptime = shell_exec('uptime -p'); return trim($uptime ?: 'N/A'); } return 'N/A'; } }