id); } session([self::SESSION_KEY => (int) $stabile->id]); return true; } public static function resolveActiveStabileId(User $user): ?int { $allowed = self::accessibleStabili($user)->pluck('id')->map(fn($v) => (int) $v)->values(); if ($allowed->isEmpty()) { session()->forget(self::SESSION_KEY); return null; } $sessionId = session(self::SESSION_KEY); if (is_numeric($sessionId)) { $sessionId = (int) $sessionId; if ($allowed->contains($sessionId)) { return $sessionId; } } // Persistenza: prova a ripristinare l'ultimo stabile usato dall'utente. $persistedId = self::getPersistedStabileId($user); if ($persistedId && $allowed->contains($persistedId)) { session([self::SESSION_KEY => $persistedId]); return $persistedId; } $default = (int) config('netgescon.defaults.default_stabile_id', 0); if ($default > 0 && $allowed->contains($default)) { session([self::SESSION_KEY => $default]); return $default; } $first = (int) $allowed->first(); session([self::SESSION_KEY => $first]); return $first; } private static function getPersistedStabileId(User $user): ?int { if (! Schema::hasColumn('users', 'last_stabile_id')) { return null; } $candidate = $user->getAttribute('last_stabile_id'); if (! is_numeric($candidate)) { $candidate = DB::table('users')->where('id', (int) $user->id)->value('last_stabile_id'); } return is_numeric($candidate) ? (int) $candidate : null; } /** * @return Collection */ public static function accessibleStabili(User $user): Collection { // Super-admin / admin: tutto if ($user->hasAnyRole(['super-admin', 'admin'])) { return Stabile::query()->attivi()->orderBy('codice_stabile')->get(); } // Amministratore: per amministratore_id if ($user->hasRole('amministratore') && $user->amministratore) { $owned = Stabile::query() ->attivi() ->byAmministratore($user->amministratore->id) ->get(); // Supporta anche assegnazioni esplicite (stesso pivot dei collaboratori). $assigned = $user->stabiliAssegnati()->where('stabili.attivo', true)->get(); return $owned ->merge($assigned) ->unique('id') ->sortBy(fn(Stabile $s) => (string) $s->codice_stabile) ->values(); } // Collaboratore: via pivot if ($user->hasRole('collaboratore')) { return $user->stabiliAssegnati()->where('attivo', true)->orderBy('codice_stabile')->get(); } // Condomino / fornitore: per ora nessun accesso “stabili gestiti” return collect(); } public static function getActiveStabileId(?User $user = null): ?int { if ($user) { return self::resolveActiveStabileId($user); } $sessionId = session(self::SESSION_KEY); if (is_numeric($sessionId)) { return (int) $sessionId; } $default = (int) config('netgescon.defaults.default_stabile_id', 0); if ($default > 0) { return $default; } if ($user) { return self::accessibleStabili($user)->first()?->id; } return null; } public static function getActiveStabile(?User $user = null): ?Stabile { $id = self::getActiveStabileId($user); if (! $id) { return null; } if ($user) { return self::accessibleStabili($user)->firstWhere('id', $id); } return Stabile::query()->find($id); } public static function setActiveStabileId(User $user, int $stabileId): bool { $allowed = self::accessibleStabili($user)->pluck('id')->map(fn($v) => (int) $v)->all(); if (! in_array($stabileId, $allowed, true)) { return false; } session([self::SESSION_KEY => $stabileId]); if (Schema::hasColumn('users', 'last_stabile_id')) { try { DB::table('users')->where('id', (int) $user->id)->update(['last_stabile_id' => $stabileId]); } catch (\Throwable) { // best-effort: non bloccare la sessione } } return true; } }