0, 'email' => 0, 'attenzione' => 0, 'studio' => 0, ]; public array $rows = []; public function mount(): void { $user = Auth::user(); if (! $user instanceof User) { abort(403); } $this->stabileOptions = StabileContext::accessibleStabili($user) ->sortBy('denominazione') ->mapWithKeys(fn(Stabile $stabile) => [ (string) $stabile->id => trim(($stabile->codice_stabile ?: '-') . ' - ' . ($stabile->denominazione ?: 'Stabile')), ]) ->all(); $requestedStabileId = request()->query('stabile'); if (is_scalar($requestedStabileId) && array_key_exists((string) $requestedStabileId, $this->stabileOptions)) { $this->stabileId = (string) $requestedStabileId; } $requestedChannel = request()->query('channel'); if (is_string($requestedChannel) && in_array($requestedChannel, ['all', 'email', 'phone', 'whatsapp'], true)) { $this->channel = $requestedChannel; } $requestedQueue = request()->query('queue'); if (is_string($requestedQueue) && in_array($requestedQueue, ['all', 'attenzione', 'ticket', 'studio'], true)) { $this->queue = $requestedQueue; } $this->refreshData(); } public function updatedStabileId(): void { $this->refreshData(); } public function updatedChannel(): void { $this->refreshData(); } public function updatedQueue(): void { $this->refreshData(); } protected function refreshData(): void { $query = $this->baseQuery(); $this->stats = [ 'totale' => (clone $query)->count(), 'email' => (clone $query)->where('channel', 'email')->count(), 'attenzione' => (clone $query)->where(function (Builder $builder): void { $builder ->whereNull('ticket_id') ->orWhereNull('status') ->orWhere('status', '!=', 'closed'); })->count(), 'studio' => (clone $query)->whereNull('stabile_id')->count(), ]; $this->rows = (clone $query) ->with(['stabile:id,codice_stabile,denominazione']) ->latest('received_at') ->latest('id') ->limit(60) ->get() ->map(function (CommunicationMessage $message): array { $stabileLabel = $message->stabile ? trim(($message->stabile->codice_stabile ?: '-') . ' - ' . ($message->stabile->denominazione ?: 'Stabile')) : 'Studio / generale'; return [ 'protocol_number' => (string) ($message->protocol_number ?: '-'), 'stabile_label' => $stabileLabel, 'stabile_url' => $message->stabile_id ? StabilePage::getUrl(['stabile' => (int) $message->stabile_id], panel : 'admin-filament'): null, 'channel' => (string) ($message->channel ?: '-'), 'sender_name' => (string) ($message->sender_name ?: '-'), 'message_text' => Str::limit((string) ($message->message_text ?: ''), 140), 'status' => (string) ($message->status ?: '-'), 'ticket_id' => $message->ticket_id ? (int) $message->ticket_id : null, 'ticket_url' => $message->ticket_id ? TicketGestione::getUrl(['ticket' => (int) $message->ticket_id, 'tab' => 'scheda'], panel : 'admin-filament'): null, 'received_at' => optional($message->received_at)->format('d/m/Y H:i') ?: '-', ]; }) ->all(); } protected function baseQuery(): Builder { $user = Auth::user(); $allowedIds = $user instanceof User ? StabileContext::accessibleStabili($user)->pluck('id')->map(fn($value) => (int) $value)->all() : []; $query = CommunicationMessage::query(); if ($allowedIds !== []) { $query->where(function (Builder $builder) use ($allowedIds): void { $builder->whereIn('stabile_id', $allowedIds) ->orWhereNull('stabile_id'); }); } else { $query->whereNull('stabile_id'); } if ($this->stabileId !== null && $this->stabileId !== '') { $query->where('stabile_id', (int) $this->stabileId); } if ($this->channel !== 'all') { $query->where('channel', $this->channel); } if ($this->queue === 'attenzione') { $query->where(function (Builder $builder): void { $builder ->whereNull('ticket_id') ->orWhereNull('status') ->orWhere('status', '!=', 'closed'); }); } if ($this->queue === 'ticket') { $query->whereNotNull('ticket_id'); } if ($this->queue === 'studio') { $query->whereNull('stabile_id'); } return $query; } public static function canAccess(): bool { $user = Auth::user(); return $user instanceof User && $user->hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore']); } }