netgescon-day0/app/Filament/Pages/Gescon/RubricaUniversaleArchivio.php

123 lines
4.7 KiB
PHP

<?php
namespace App\Filament\Pages\Gescon;
use App\Models\RubricaUniversale;
use App\Models\User;
use App\Support\StabileContext;
use BackedEnum;
use Filament\Actions\Action;
use Filament\Pages\Page;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Schema;
use UnitEnum;
class RubricaUniversaleArchivio extends Page implements HasTable
{
use InteractsWithTable;
protected static bool $shouldRegisterNavigation = true;
protected static ?string $navigationLabel = 'Anagrafica unica (Rubrica)';
protected static ?string $title = 'Anagrafica unica (Rubrica)';
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-book-open';
protected static UnitEnum|string|null $navigationGroup = 'NetGescon';
protected static ?int $navigationSort = 3;
protected static ?string $slug = 'gescon/anagrafica/rubrica-universale';
protected string $view = 'filament.pages.gescon.table';
public static function canAccess(): bool
{
$user = Auth::user();
return $user instanceof User
&& $user->hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore']);
}
public function mount(): void
{
$this->mountInteractsWithTable();
}
protected function getTableQuery(): Builder
{
$user = Auth::user();
if (! $user instanceof User) {
return RubricaUniversale::query()->whereRaw('1 = 0');
}
$activeStabile = StabileContext::getActiveStabile($user);
$adminId = (int) ($activeStabile?->amministratore_id ?: 0);
if ($adminId <= 0) {
return RubricaUniversale::query()->whereRaw('1 = 0');
}
$query = RubricaUniversale::query();
// Tenant-aware: mostra TUTTI i contatti dell'amministratore (più eventuali globali se presenti).
if (Schema::hasColumn('rubrica_universale', 'amministratore_id')) {
$query->where(function (Builder $q) use ($adminId) {
$q->where('amministratore_id', $adminId)
->orWhereNull('amministratore_id');
});
}
return $query
->orderByRaw("COALESCE(ragione_sociale, '')")
->orderByRaw("COALESCE(cognome, '')")
->orderByRaw("COALESCE(nome, '')")
->orderBy('id');
}
public function table(Table $table): Table
{
return $table
->striped()
->paginationPageOptions([10, 25, 50, 100])
->defaultPaginationPageOption(25)
->columns([
TextColumn::make('codice_univoco')->label('Codice')->sortable()->searchable()->toggleable(),
TextColumn::make('nome_completo')
->label('Nominativo')
->wrap()
->searchable(query: function (Builder $query, string $search): Builder {
$search = trim($search);
if ($search === '') {
return $query;
}
$like = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search) . '%';
return $query->where(function (Builder $q) use ($like) {
$q->where('ragione_sociale', 'like', $like)
->orWhere('nome', 'like', $like)
->orWhere('cognome', 'like', $like)
->orWhereRaw("TRIM(CONCAT(COALESCE(nome, ''), ' ', COALESCE(cognome, ''))) LIKE ?", [$like]);
});
}),
TextColumn::make('categoria')->label('Categoria')->sortable()->toggleable(),
TextColumn::make('partita_iva')->label('P.IVA')->searchable()->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('codice_fiscale')->label('CF')->searchable()->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('email')->label('Email')->searchable()->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('pec')->label('PEC')->searchable()->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('stato')->label('Stato')->sortable()->toggleable(isToggledHiddenByDefault: true),
])
->actions([
Action::make('apri_scheda')
->label('Apri scheda')
->icon('heroicon-o-identification')
->url(fn(RubricaUniversale $record) => RubricaUniversaleScheda::getUrl(['record' => $record->id], panel: 'admin-filament')),
]);
}
}