diff --git a/backoffice/app/Filament/Concerns/SoloSuperadmin.php b/backoffice/app/Filament/Concerns/SoloSuperadmin.php new file mode 100644 index 0000000..0fcd7be --- /dev/null +++ b/backoffice/app/Filament/Concerns/SoloSuperadmin.php @@ -0,0 +1,27 @@ +user()?->is_superadmin; + } + + public static function canAccess(): bool + { + return static::isSuperadmin() && parent::canAccess(); + } + + public static function can(string $action, ?Model $record = null): bool + { + return static::isSuperadmin() && parent::can($action, $record); + } +} diff --git a/backoffice/app/Filament/Resources/FinituraResource.php b/backoffice/app/Filament/Resources/FinituraResource.php index ac05a25..4ac0b3d 100644 --- a/backoffice/app/Filament/Resources/FinituraResource.php +++ b/backoffice/app/Filament/Resources/FinituraResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Concerns\SoloSuperadmin; use App\Filament\Resources\FinituraResource\Pages; use App\Filament\Support\CampiConfiguratore; use App\Models\Finitura; @@ -14,8 +15,11 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Collection; use Illuminate\Validation\Rules\Unique; + class FinituraResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = Finitura::class; protected static ?string $navigationIcon = 'heroicon-o-swatch'; diff --git a/backoffice/app/Filament/Resources/GruppoOpzioniResource.php b/backoffice/app/Filament/Resources/GruppoOpzioniResource.php index e5fed4f..a069446 100644 --- a/backoffice/app/Filament/Resources/GruppoOpzioniResource.php +++ b/backoffice/app/Filament/Resources/GruppoOpzioniResource.php @@ -10,10 +10,14 @@ use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; +use App\Filament\Concerns\SoloSuperadmin; /** Gruppi di opzioni del configuratore: un nuovo gruppo si crea qui, le sue voci in "Opzioni e supplementi". */ + class GruppoOpzioniResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = GruppoOpzioni::class; protected static ?string $navigationIcon = 'heroicon-o-queue-list'; diff --git a/backoffice/app/Filament/Resources/ModelloResource.php b/backoffice/app/Filament/Resources/ModelloResource.php index 22bac15..98773b6 100644 --- a/backoffice/app/Filament/Resources/ModelloResource.php +++ b/backoffice/app/Filament/Resources/ModelloResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Concerns\SoloSuperadmin; use App\Filament\Resources\ModelloResource\Pages; use App\Filament\Resources\ModelloResource\RelationManagers\FinitureRelationManager; use App\Filament\Resources\ModelloResource\RelationManagers\ListinoRelationManager; @@ -16,8 +17,11 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Validation\Rules\Unique; + class ModelloResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = Modello::class; protected static ?string $navigationIcon = 'heroicon-o-squares-2x2'; diff --git a/backoffice/app/Filament/Resources/OpzioneResource.php b/backoffice/app/Filament/Resources/OpzioneResource.php index 792fb78..380fe9c 100644 --- a/backoffice/app/Filament/Resources/OpzioneResource.php +++ b/backoffice/app/Filament/Resources/OpzioneResource.php @@ -17,10 +17,14 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; use Illuminate\Validation\Rules\Unique; +use App\Filament\Concerns\SoloSuperadmin; /** Opzioni e supplementi del sistema (le personalizzazioni per modello sono nella scheda del modello). */ + class OpzioneResource extends Resource { + use SoloSuperadmin; + /** Voce "Altro" del valore nelle opzioni personalizzate: valore scritto a mano. */ public const ALTRO = '__altro'; diff --git a/backoffice/app/Filament/Resources/RegolaVetroResource.php b/backoffice/app/Filament/Resources/RegolaVetroResource.php index fe07214..965fa69 100644 --- a/backoffice/app/Filament/Resources/RegolaVetroResource.php +++ b/backoffice/app/Filament/Resources/RegolaVetroResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Concerns\SoloSuperadmin; use App\Filament\Resources\RegolaVetroResource\Pages; use App\Filament\Support\CampiConfiguratore; use App\Models\RegolaVetro; @@ -14,8 +15,11 @@ use Filament\Tables\Table; use Illuminate\Support\HtmlString; use Illuminate\Validation\Rules\Unique; + class RegolaVetroResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = RegolaVetro::class; protected static ?string $navigationIcon = 'heroicon-o-calculator'; diff --git a/backoffice/app/Filament/Resources/SistemaResource.php b/backoffice/app/Filament/Resources/SistemaResource.php index 4bed834..39adda1 100644 --- a/backoffice/app/Filament/Resources/SistemaResource.php +++ b/backoffice/app/Filament/Resources/SistemaResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Concerns\SoloSuperadmin; use App\Filament\Resources\SistemaResource\Actions\ImportaListiniAction; use App\Filament\Resources\SistemaResource\Pages; use App\Models\Sistema; @@ -11,8 +12,11 @@ use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; + class SistemaResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = Sistema::class; protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; diff --git a/backoffice/app/Filament/Resources/VetroResource.php b/backoffice/app/Filament/Resources/VetroResource.php index aa99d24..30e37c5 100644 --- a/backoffice/app/Filament/Resources/VetroResource.php +++ b/backoffice/app/Filament/Resources/VetroResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Concerns\SoloSuperadmin; use App\Filament\Resources\VetroResource\Pages; use App\Filament\Support\CampiConfiguratore; use App\Models\Vetro; @@ -13,8 +14,11 @@ use Filament\Tables; use Filament\Tables\Table; use Illuminate\Validation\Rules\Unique; + class VetroResource extends Resource { + use SoloSuperadmin; + protected static ?string $model = Vetro::class; protected static ?string $navigationIcon = 'heroicon-o-square-2-stack'; diff --git a/backoffice/app/Models/User.php b/backoffice/app/Models/User.php index f6ba1d2..d8389f5 100644 --- a/backoffice/app/Models/User.php +++ b/backoffice/app/Models/User.php @@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; -#[Fillable(['name', 'email', 'password'])] +#[Fillable(['name', 'email', 'password', 'is_superadmin'])] #[Hidden(['password', 'remember_token'])] class User extends Authenticatable { @@ -27,6 +27,7 @@ class User extends Authenticatable return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', + 'is_superadmin' => 'boolean', ]; } } diff --git a/backoffice/app/Providers/Filament/AdminPanelProvider.php b/backoffice/app/Providers/Filament/AdminPanelProvider.php index 314f3f9..a86450f 100644 --- a/backoffice/app/Providers/Filament/AdminPanelProvider.php +++ b/backoffice/app/Providers/Filament/AdminPanelProvider.php @@ -27,6 +27,7 @@ class AdminPanelProvider extends PanelProvider ->id('admin') ->path('admin') ->login() + ->profile(isSimple: false) ->brandName('Krèios') ->brandLogo(asset('images/kreios-logo.jpg')) ->brandLogoHeight('2.5rem') diff --git a/backoffice/database/migrations/2026_10_23_100000_add_is_superadmin_to_users.php b/backoffice/database/migrations/2026_10_23_100000_add_is_superadmin_to_users.php new file mode 100644 index 0000000..2da1273 --- /dev/null +++ b/backoffice/database/migrations/2026_10_23_100000_add_is_superadmin_to_users.php @@ -0,0 +1,40 @@ +boolean('is_superadmin')->default(false)->after('password'); + }); + + // Superadmin iniziale: password provvisoria, da cambiare dal profilo. + if (! DB::table('users')->where('email', 'admin@aurealab.net')->exists()) { + DB::table('users')->insert([ + 'name' => 'Superadmin', + 'email' => 'admin@aurealab.net', + 'password' => Hash::make('Aurealab-Kreios-2026!'), + 'is_superadmin' => true, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } else { + DB::table('users')->where('email', 'admin@aurealab.net')->update(['is_superadmin' => true]); + } + } + + public function down(): void + { + DB::table('users')->where('email', 'admin@aurealab.net')->delete(); + + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('is_superadmin'); + }); + } +}; diff --git a/backoffice/database/seeders/DatabaseSeeder.php b/backoffice/database/seeders/DatabaseSeeder.php index e1c4e1c..0514839 100644 --- a/backoffice/database/seeders/DatabaseSeeder.php +++ b/backoffice/database/seeders/DatabaseSeeder.php @@ -14,7 +14,7 @@ class DatabaseSeeder extends Seeder public function run(): void { // Utente amministratore del backoffice. - User::updateOrCreate( + User::firstOrCreate( ['email' => 'admin@kreiosinfissi.it'], [ 'name' => 'Amministratore', @@ -22,6 +22,16 @@ class DatabaseSeeder extends Seeder ] ); + // Superadmin: vede anche le sezioni Prodotti e Configuratore. + User::firstOrCreate( + ['email' => 'admin@aurealab.net'], + [ + 'name' => 'Superadmin', + 'password' => Hash::make('Aurealab-Kreios-2026!'), + 'is_superadmin' => true, + ] + ); + $this->call([CatalogoSeeder::class, ConfiguratoreSeeder::class, ProfiliExtraSeeder::class, NuoveOpzioniSeeder::class]); } }