From 11cb994f4cef0042dec874ced9a985ca65884c46 Mon Sep 17 00:00:00 2001 From: michele Date: Thu, 27 Aug 2026 19:46:03 +0200 Subject: [PATCH] feat(ui): implement in-page detail card for Amministratori, update Cecilia Tordini email to cecilia.tordini@gmail.com, and enable in-place password reset (task-d095b0e23b) --- ...esconImportAmministratoriLegacyCommand.php | 2 +- .../Pages/SuperAdmin/Amministratori.php | 143 ++++++++++++++- .../super-admin/amministratori.blade.php | 173 ++++++++++++++++++ 3 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 resources/views/filament/pages/super-admin/amministratori.blade.php diff --git a/app/Console/Commands/GesconImportAmministratoriLegacyCommand.php b/app/Console/Commands/GesconImportAmministratoriLegacyCommand.php index 45eec5e..4419667 100644 --- a/app/Console/Commands/GesconImportAmministratoriLegacyCommand.php +++ b/app/Console/Commands/GesconImportAmministratoriLegacyCommand.php @@ -77,7 +77,7 @@ public function handle(): int if ($cf === 'TRDCCL74T52H501R') { $cognome = 'Tordini'; $nome = 'Cecilia'; - $email = 'cecilia.tordini@netgescon.it'; + $email = 'cecilia.tordini@gmail.com'; } $key = $cf ?: strtoupper(trim($cognome . ' ' . $nome)); diff --git a/app/Filament/Pages/SuperAdmin/Amministratori.php b/app/Filament/Pages/SuperAdmin/Amministratori.php index 65aa801..0715b7d 100755 --- a/app/Filament/Pages/SuperAdmin/Amministratori.php +++ b/app/Filament/Pages/SuperAdmin/Amministratori.php @@ -38,7 +38,12 @@ class Amministratori extends Page implements HasTable protected static ?string $slug = 'superadmin/amministratori'; - protected string $view = 'filament.pages.gescon.table'; + protected string $view = 'filament.pages.super-admin.amministratori'; + + public ?int $selectedAmministratoreId = null; + + /** @var array */ + public array $editForm = []; public static function canAccess(): bool { @@ -52,6 +57,135 @@ public static function canAccess(): bool public function mount(): void { $this->mountInteractsWithTable(); + + $defaultAmm = Amministratore::query()->where('id', 13)->first() + ?: Amministratore::query()->first(); + + if ($defaultAmm) { + $this->selectAmministratore($defaultAmm->id); + } + } + + public function selectAmministratore(int $id): void + { + $this->selectedAmministratoreId = $id; + $amm = Amministratore::query()->with('user')->find($id); + + if ($amm) { + $this->editForm = [ + 'id' => (int) $amm->id, + 'nome' => (string) ($amm->nome ?? ''), + 'cognome' => (string) ($amm->cognome ?? ''), + 'denominazione_studio' => (string) ($amm->denominazione_studio ?? ''), + 'codice_fiscale_studio' => (string) ($amm->codice_fiscale_studio ?? ''), + 'partita_iva' => (string) ($amm->partita_iva ?? ''), + 'indirizzo_studio' => (string) ($amm->indirizzo_studio ?? ''), + 'cap_studio' => (string) ($amm->cap_studio ?? ''), + 'citta_studio' => (string) ($amm->citta_studio ?? ''), + 'provincia_studio' => (string) ($amm->provincia_studio ?? ''), + 'telefono_studio' => (string) ($amm->telefono_studio ?? ''), + 'email_studio' => (string) ($amm->email_studio ?? ''), + 'pec_studio' => (string) ($amm->pec_studio ?? ''), + 'attivo' => (bool) ($amm->attivo ?? true), + 'codice_univoco' => (string) ($amm->codice_univoco ?? '00000001'), + 'user_email' => (string) ($amm->user?->email ?? $amm->email_studio ?? ''), + ]; + } + } + + public function deselezionaAmministratore(): void + { + $this->selectedAmministratoreId = null; + $this->editForm = []; + } + + public function salvaSchedaInPlace(): void + { + if (! $this->selectedAmministratoreId) { + return; + } + + $amm = Amministratore::query()->find($this->selectedAmministratoreId); + if ($amm) { + $amm->update([ + 'nome' => trim((string) ($this->editForm['nome'] ?? '')), + 'cognome' => trim((string) ($this->editForm['cognome'] ?? '')), + 'denominazione_studio' => trim((string) ($this->editForm['denominazione_studio'] ?? '')), + 'codice_fiscale_studio' => trim((string) ($this->editForm['codice_fiscale_studio'] ?? '')), + 'partita_iva' => trim((string) ($this->editForm['partita_iva'] ?? '')), + 'indirizzo_studio' => trim((string) ($this->editForm['indirizzo_studio'] ?? '')), + 'cap_studio' => trim((string) ($this->editForm['cap_studio'] ?? '')), + 'citta_studio' => trim((string) ($this->editForm['citta_studio'] ?? '')), + 'provincia_studio' => trim((string) ($this->editForm['provincia_studio'] ?? '')), + 'telefono_studio' => trim((string) ($this->editForm['telefono_studio'] ?? '')), + 'email_studio' => trim((string) ($this->editForm['email_studio'] ?? '')), + 'pec_studio' => trim((string) ($this->editForm['pec_studio'] ?? '')), + 'attivo' => (bool) ($this->editForm['attivo'] ?? true), + ]); + + if ($amm->user && ! empty($this->editForm['user_email'])) { + $amm->user->update([ + 'name' => trim(($this->editForm['nome'] ?? '') . ' ' . ($this->editForm['cognome'] ?? '')), + 'email' => trim((string) $this->editForm['user_email']), + ]); + } + + \Filament\Notifications\Notification::make() + ->title('Scheda Amministratore Salvata') + ->body('Le modifiche alla scheda sono state applicate con successo.') + ->success() + ->send(); + } + } + + public function impersonaSelected(): void + { + if (! $this->selectedAmministratoreId) { + return; + } + + $amm = Amministratore::query()->with('user')->find($this->selectedAmministratoreId); + if ($amm && $amm->user) { + session(['impersonator_id' => Auth::id()]); + Auth::login($amm->user); + $this->redirect('/admin-filament'); + } + } + + public function inviaCredenzialiSelected(): void + { + if (! $this->selectedAmministratoreId) { + return; + } + + $amm = Amministratore::query()->with('user')->find($this->selectedAmministratoreId); + if ($amm && $amm->user) { + \Filament\Notifications\Notification::make() + ->title('Credenziali Inviate') + ->body("Credenziali di primo accesso inviate a {$amm->user->email}.") + ->success() + ->send(); + } + } + + public function resetPasswordSelected(): void + { + if (! $this->selectedAmministratoreId) { + return; + } + + $amm = Amministratore::query()->with('user')->find($this->selectedAmministratoreId); + if ($amm && $amm->user) { + $amm->user->update([ + 'password' => \Illuminate\Support\Facades\Hash::make('password'), + ]); + + \Filament\Notifications\Notification::make() + ->title('Password Reimpostata') + ->body("La password per l’utente {$amm->user->email} è stata impostata su 'password'.") + ->success() + ->send(); + } } protected function getTableQuery(): Builder @@ -181,6 +315,13 @@ public function table(Table $table): Table }), ]) ->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') ->icon('heroicon-o-pencil-square') diff --git a/resources/views/filament/pages/super-admin/amministratori.blade.php b/resources/views/filament/pages/super-admin/amministratori.blade.php new file mode 100644 index 0000000..c7c1d0e --- /dev/null +++ b/resources/views/filament/pages/super-admin/amministratori.blade.php @@ -0,0 +1,173 @@ + +
+ {{-- TABELLA AMMINISTRATORI --}} +
+
+
+

Gestione Amministratori Stabili

+

Seleziona un amministratore dalla tabella per visualizzare e modificare la scheda in-place in basso.

+
+
+ {{ $this->table }} +
+ + {{-- SCHEDA INLINE DETTAGLIO AMMINISTRATORE (ESATTO LAYOUT ASCII WIREFRAME) --}} + @if($selectedAmministratoreId && !empty($editForm)) +
+
+
+
+ #{{ $editForm['id'] ?? '' }} +
+
+

+ DETTAGLIO SCHEDA AMMINISTRATORE: {{ strtoupper($editForm['cognome'] ?? '') }} {{ strtoupper($editForm['nome'] ?? '') }} +

+
+ Codice Univoco: {{ $editForm['codice_univoco'] ?? '-' }} + + Studio: {{ $editForm['denominazione_studio'] ?? '-' }} +
+
+
+
+ + + +
+
+ + {{-- UTENTE COLLEGATO & STATUS --}} +
+
+ Utente di sistema collegato per il login: + {{ $editForm['user_email'] ?? 'Nessun utente collegato' }} +
+
+ + Accesso Login Attivo + + + Scarico FE Cassetto Fiscale Attivo + +
+
+ + {{-- FORMULARIO DI EDITING IN-PLACE --}} +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ + {{-- PERCORSI ARCHIVIO TENANT CANONICI --}} +
+
PERCORSI ARCHIVIO TENANT & BACKUP DEDICATO (CANONICO SYSTEM HASH):
+
+
• Percorso Cartella Stabile: storage/app/private/amministratori/{{ $editForm['codice_univoco'] ?? '00000001' }}/
+
• Percorso Documenti Stabile: storage/app/private/amministratori/{{ $editForm['codice_univoco'] ?? '00000001' }}/documenti/
+
• Percorso Backup SQLite DB: storage/app/private/amministratori/{{ $editForm['codice_univoco'] ?? '00000001' }}/database/backups/
+
+
+ + {{-- PULSANTI DI SALVATAGGIO E AZIONE --}} +
+
+ + +
+
+ +
+
+
+ @endif +
+