109 lines
3.3 KiB
PHP
109 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Pages\Condomini;
|
|
|
|
use App\Filament\Pages\Strumenti\DocumentiArchivio;
|
|
use App\Models\Assemblea;
|
|
use App\Models\Stabile;
|
|
use App\Models\User;
|
|
use App\Support\StabileContext;
|
|
use BackedEnum;
|
|
use Filament\Actions\Action;
|
|
use Filament\Pages\Page;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use UnitEnum;
|
|
|
|
class AssembleeHub extends Page
|
|
{
|
|
protected static ?string $navigationLabel = 'HUB Assemblee';
|
|
|
|
protected static ?string $title = 'HUB Assemblee';
|
|
|
|
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-megaphone';
|
|
|
|
protected static UnitEnum|string|null $navigationGroup = 'Stabile';
|
|
|
|
protected static ?int $navigationSort = 35;
|
|
|
|
protected static ?string $slug = 'condomini/assemblee-hub';
|
|
|
|
protected string $view = 'filament.pages.condomini.assemblee-hub';
|
|
|
|
public ?Stabile $stabileAttivo = null;
|
|
|
|
public static function canAccess(): bool
|
|
{
|
|
$user = Auth::user();
|
|
|
|
return $user instanceof User
|
|
&& $user->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 getStatsProperty(): array
|
|
{
|
|
$stabileId = (int) ($this->stabileAttivo?->id ?? 0);
|
|
if ($stabileId <= 0) {
|
|
return ['totale' => 0, 'convocate' => 0, 'in_calendario' => 0, 'con_verbale' => 0];
|
|
}
|
|
|
|
$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' => (clone $query)->whereHas('verbale')->count(),
|
|
];
|
|
}
|
|
|
|
public function getAssembleeRowsProperty(): Collection
|
|
{
|
|
$stabileId = (int) ($this->stabileAttivo?->id ?? 0);
|
|
if ($stabileId <= 0) {
|
|
return collect();
|
|
}
|
|
|
|
return Assemblea::query()
|
|
->with(['verbale:id,assemblea_id'])
|
|
->withCount(['ordineGiorno', 'convocazioni', 'presenze', 'documenti'])
|
|
->where('stabile_id', $stabileId)
|
|
->orderByDesc('data_seconda_convocazione')
|
|
->orderByDesc('data_prima_convocazione')
|
|
->orderByDesc('id')
|
|
->limit(16)
|
|
->get();
|
|
}
|
|
} |