hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore']); } public function mount(): void { $user = Auth::user(); if (! $user instanceof User) { return; } $activeId = StabileContext::resolveActiveStabileId($user); if (! $activeId) { return; } $this->stabileAttivo = StabileContext::accessibleStabili($user)->firstWhere('id', $activeId); } protected function getHeaderActions(): array { return [ Action::make('apri_documenti') ->label('Archivio documenti') ->icon('heroicon-o-folder-open') ->url(fn(): string => DocumentiArchivio::getUrl(panel: 'admin-filament')), ]; } public function creaNuovaAssemblea(): void { if (!$this->stabileAttivo) return; $assemblea = Assemblea::create([ 'stabile_id' => $this->stabileAttivo->id, 'tipo' => 'ordinaria', 'data_prima_convocazione' => now()->addDays(15)->setHour(17)->setMinute(0)->setSecond(0), 'data_seconda_convocazione' => now()->addDays(16)->setHour(17)->setMinute(0)->setSecond(0), 'luogo' => 'Da definire', 'note' => '', 'stato' => 'bozza', 'creato_da_user_id' => Auth::id(), ]); $this->redirect(GestioneAssemblea::getUrl(['record' => $assemblea->id])); } public function eliminaAssemblea(int $id): void { $assemblea = Assemblea::find($id); if ($assemblea) { $assemblea->delete(); $this->dispatch('notify', [ 'status' => 'success', 'message' => 'Assemblea eliminata con successo!' ]); } } public function getStatsProperty(): array { $stabileId = (int) ($this->stabileAttivo?->id ?? 0); if ($stabileId <= 0 || ! $this->canQueryAssemblee()) { return ['totale' => 0, 'convocate' => 0, 'in_calendario' => 0, 'con_verbale' => 0]; } try { $query = Assemblea::query()->where('stabile_id', $stabileId); return [ 'totale' => (clone $query)->count(), 'convocate' => (clone $query)->where('stato', 'convocata')->count(), 'in_calendario' => (clone $query) ->where(function ($builder): void { $today = now(); $builder->whereDate('data_prima_convocazione', '>=', $today->toDateString()) ->orWhereDate('data_seconda_convocazione', '>=', $today->toDateString()); }) ->count(), 'con_verbale' => 0, ]; } catch (QueryException) { return ['totale' => 0, 'convocate' => 0, 'in_calendario' => 0, 'con_verbale' => 0]; } } public function getAssembleeRowsProperty(): Collection { $stabileId = (int) ($this->stabileAttivo?->id ?? 0); if ($stabileId <= 0 || ! $this->canQueryAssemblee()) { return collect(); } try { return Assemblea::query() ->where('stabile_id', $stabileId) ->orderByDesc('data_seconda_convocazione') ->orderByDesc('data_prima_convocazione') ->orderByDesc('id') ->withCount([ 'ordineGiorno as ordine_giorno_count', 'convocazioni as convocazioni_count', 'presenze as presenze_count' ]) ->get(); } catch (QueryException) { return collect(); } } private function canQueryAssemblee(): bool { try { return Schema::hasTable((new Assemblea())->getTable()); } catch (QueryException) { return false; } } public function getSospesiRowsProperty(): Collection { $stabileId = (int) ($this->stabileAttivo?->id ?? 0); if ($stabileId <= 0) { return collect(); } return OrdineGiorno::query() ->whereHas('assemblea', function ($query) use ($stabileId) { $query->where('stabile_id', $stabileId) ->where('stato', 'svolta'); }) ->whereIn('esito_votazione', ['non_deliberato', 'rimandato', 'sospeso']) ->whereNull('imported_to_id') ->orderBy('id') ->get(); } }