189 lines
6.3 KiB
PHP
Executable File
189 lines
6.3 KiB
PHP
Executable File
<?php
|
|
namespace App\Filament\Pages\Strumenti;
|
|
|
|
use App\Filament\Pages\Condomini\StabilePage;
|
|
use App\Filament\Pages\Supporto\TicketGestione;
|
|
use App\Models\CommunicationMessage;
|
|
use App\Models\Stabile;
|
|
use App\Models\User;
|
|
use App\Support\StabileContext;
|
|
use BackedEnum;
|
|
use Filament\Pages\Page;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Str;
|
|
|
|
class Comunicazioni extends Page
|
|
{
|
|
protected static ?string $title = 'Comunicazioni';
|
|
|
|
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-chat-bubble-left-right';
|
|
|
|
protected static ?string $slug = 'strumenti/comunicazioni';
|
|
|
|
protected static bool $shouldRegisterNavigation = false;
|
|
|
|
protected string $view = 'filament.pages.strumenti.comunicazioni';
|
|
|
|
public ?string $stabileId = null;
|
|
|
|
public string $channel = 'all';
|
|
|
|
public string $queue = 'all';
|
|
|
|
public array $stabileOptions = [];
|
|
|
|
public array $stats = [
|
|
'totale' => 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']);
|
|
}
|
|
}
|