diff --git a/app/Filament/Pages/SuperAdmin/Amministratori.php b/app/Filament/Pages/SuperAdmin/Amministratori.php index 36da8d9..2d40fd2 100755 --- a/app/Filament/Pages/SuperAdmin/Amministratori.php +++ b/app/Filament/Pages/SuperAdmin/Amministratori.php @@ -223,24 +223,18 @@ public function table(Table $table): Table TextColumn::make('codice_univoco')->label('Codice')->searchable()->sortable(), TextColumn::make('nome')->label('Nome')->searchable()->sortable(), TextColumn::make('cognome')->label('Cognome')->searchable()->sortable(), + TextColumn::make('denominazione_studio')->label('Studio')->searchable(), TextColumn::make('stabili_count')->label('Stabili')->sortable(), - TextColumn::make('denominazione_studio')->label('Studio')->searchable()->toggleable(), - TextColumn::make('email_studio')->label('Email')->searchable()->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('pec_studio')->label('PEC')->searchable()->toggleable(isToggledHiddenByDefault: true), - IconColumn::make('attivo')->label('Attivo')->boolean()->sortable()->toggleable(), - IconColumn::make('abilita_import_stabili')->label('Import')->boolean()->sortable()->toggleable(isToggledHiddenByDefault: true), TextColumn::make('fe_cassetto_status') - ->label('FE Stato') + ->label('FE') ->state(function (Amministratore $record): string { if (! (bool) ($record->fe_cassetto_enabled ?? false)) { - return 'Disabilitato'; + return 'Off'; } - $expiresAt = $record->fe_cassetto_expires_at; if ($expiresAt instanceof Carbon && $expiresAt->startOfDay()->lt(now()->startOfDay())) { return 'Scaduto'; } - return 'Attivo'; }) ->badge() @@ -248,102 +242,21 @@ public function table(Table $table): Table if (! (bool) ($record->fe_cassetto_enabled ?? false)) { return 'gray'; } - $expiresAt = $record->fe_cassetto_expires_at; if ($expiresAt instanceof Carbon && $expiresAt->startOfDay()->lt(now()->startOfDay())) { return 'danger'; } - return 'success'; }) ->sortable(), - IconColumn::make('fe_cassetto_enabled')->label('FE Abilitato')->boolean()->sortable()->toggleable(), - TextColumn::make('fe_cassetto_expires_at')->label('FE Scadenza')->date('d/m/Y')->sortable()->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('updated_at')->label('Aggiornato')->dateTime('d/m/Y H:i')->toggleable(isToggledHiddenByDefault: true), - ]) - ->headerActions([ - Action::make('create') - ->label('Nuovo') - ->icon('heroicon-o-plus') - ->form([ - Select::make('user_id') - ->label('Utente collegato') - ->options(fn() => User::query() - ->whereDoesntHave('amministratore') - ->orderBy('name') - ->get() - ->mapWithKeys(fn(User $u) => [ - $u->id => trim($u->name . ' <' . $u->email . '>'), - ]) - ->all()) - ->searchable() - ->required(), - TextInput::make('nome')->label('Nome')->required()->maxLength(100), - TextInput::make('cognome')->label('Cognome')->required()->maxLength(100), - TextInput::make('denominazione_studio')->label('Denominazione studio')->maxLength(255), - TextInput::make('partita_iva')->label('Partita IVA')->maxLength(30), - TextInput::make('codice_fiscale_studio')->label('Codice fiscale')->maxLength(30), - TextInput::make('indirizzo_studio')->label('Indirizzo')->maxLength(255), - TextInput::make('cap_studio')->label('CAP')->maxLength(10), - TextInput::make('citta_studio')->label('Città')->maxLength(60), - TextInput::make('provincia_studio')->label('Provincia')->maxLength(5), - TextInput::make('telefono_studio')->label('Telefono')->maxLength(50), - TextInput::make('email_studio')->label('Email')->maxLength(255), - TextInput::make('pec_studio')->label('PEC')->maxLength(255), - Toggle::make('attivo')->label('Attivo')->default(true), - Toggle::make('abilita_import_stabili')->label('Abilita import stabili')->default(true), - - Toggle::make('fe_cassetto_enabled') - ->label('Abilita servizio scarico Fatture (Cassetto Fiscale)') - ->helperText('Servizio a pagamento: abilita solo per gli amministratori autorizzati.') - ->default(false), - - DatePicker::make('fe_cassetto_expires_at') - ->label('Scadenza servizio (opzionale)') - ->helperText('Se valorizzata, dopo questa data lo scarico sarà bloccato finché non rinnovato.') - ->native(false) - ->displayFormat('d/m/Y') - ->nullable(), - ]) - ->action(function (array $data): void { - $amm = Amministratore::query()->create([ - 'user_id' => (int) ($data['user_id'] ?? 0), - 'nome' => trim((string) ($data['nome'] ?? '')), - 'cognome' => trim((string) ($data['cognome'] ?? '')), - 'denominazione_studio' => (string) ($data['denominazione_studio'] ?? ''), - 'partita_iva' => (string) ($data['partita_iva'] ?? ''), - 'codice_fiscale_studio' => (string) ($data['codice_fiscale_studio'] ?? ''), - 'indirizzo_studio' => (string) ($data['indirizzo_studio'] ?? ''), - 'cap_studio' => (string) ($data['cap_studio'] ?? ''), - 'citta_studio' => (string) ($data['citta_studio'] ?? ''), - 'provincia_studio' => (string) ($data['provincia_studio'] ?? ''), - 'telefono_studio' => (string) ($data['telefono_studio'] ?? ''), - 'email_studio' => (string) ($data['email_studio'] ?? ''), - 'pec_studio' => (string) ($data['pec_studio'] ?? ''), - 'attivo' => (bool) ($data['attivo'] ?? true), - 'abilita_import_stabili' => (bool) ($data['abilita_import_stabili'] ?? true), - - 'fe_cassetto_enabled' => (bool) ($data['fe_cassetto_enabled'] ?? false), - 'fe_cassetto_expires_at' => $data['fe_cassetto_expires_at'] ?? null, - ]); - - // Best-effort: provisioning cartelle. - try { - $amm->provisionArchiveIfMissing(); - } catch (\Throwable) { - } - }), + TextColumn::make('email_studio')->label('Email')->searchable()->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('pec_studio')->label('PEC')->searchable()->toggleable(isToggledHiddenByDefault: true), + IconColumn::make('attivo')->label('Attivo')->boolean()->sortable()->toggleable(isToggledHiddenByDefault: true), ]) ->actions([ - Action::make('select') - ->label('Dettaglio Scheda') - ->icon('heroicon-o-pencil-square') - ->color('primary') - ->action(function (Amministratore $record): void { - $this->selectAmministratore($record->id); - }), Action::make('edit') - ->label('Modifica') + ->label('') + ->tooltip('✏️ Modifica & Apri Tab 2') ->icon('heroicon-o-pencil-square') ->color('primary') ->action(function (Amministratore $record): void { @@ -351,23 +264,31 @@ public function table(Table $table): Table }), Action::make('impersonate') - ->label('Impersona') + ->label('') + ->tooltip('⚡ Impersona Studio 1-Click') ->icon('heroicon-o-user-plus') ->color('warning') ->requiresConfirmation() ->modalHeading('Conferma Impersonificazione Amministratore') - ->modalDescription('Stai per accedere al sistema impersonando lo studio dell’amministratore selezionato. Tutte le azioni saranno tracciate nell’audit log.') + ->modalDescription('Stai per accedere al sistema impersonando lo studio dell’amministratore selezionato. Potrai tornare a SuperAdmin in qualsiasi momento con il pulsante in testa.') ->visible(fn(Amministratore $record): bool => (bool) $record->user_id && $record->user_id !== Auth::id()) ->action(function (Amministratore $record): void { if ($record->user) { - session(['impersonator_id' => Auth::id()]); - Auth::login($record->user); - redirect()->to('/admin-filament'); + $actorId = Auth::id(); + $targetUser = $record->user; + if (method_exists($targetUser, 'hasRole') && ! $targetUser->hasAnyRole(['admin', 'amministratore', 'super-admin'])) { + $targetUser->assignRole('amministratore'); + } + session(['impersonator_id' => $actorId]); + Auth::login($targetUser); + session()->save(); + $this->redirect('/admin-filament', navigate: false); } }), Action::make('delete') - ->label('Elimina') + ->label('') + ->tooltip('Elimina Amministratore') ->icon('heroicon-o-trash') ->color('danger') ->requiresConfirmation() diff --git a/public/adminer.php b/public/adminer.php index c2dbab0..91f2171 100644 --- a/public/adminer.php +++ b/public/adminer.php @@ -76,20 +76,30 @@ function login($login, $password) { } function loginForm() { - echo '