netgescon-day0/app/Http/Controllers/SuperAdmin/AmministratoreController.php

229 lines
9.3 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\SuperAdmin;
use App\Http\Controllers\Controller;
use App\Models\Amministratore;
use App\Models\User;
use Spatie\Permission\Models\Role;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Artisan;
use App\Services\DatabaseManagerService;
class AmministratoreController extends Controller
{
protected DatabaseManagerService $dbManager;
public function setDbManager(DatabaseManagerService $dbManager): void
{
$this->dbManager = $dbManager;
}
public function __construct()
{
// Proteggi le rotte con i permessi di Spatie
$this->middleware('permission:view-amministratori', ['only' => ['index']]); // Permesso per visualizzare la lista
$this->middleware('permission:manage-amministratori', ['except' => ['index']]); // Permesso per tutte le altre azioni CRUD
}
/**
* Display a listing of the resource.
*/
public function index()
{
// Gate::authorize('view-amministratori'); // Il middleware nel costruttore è sufficiente
$amministratori = Amministratore::with('user')->paginate(10);
return view('superadmin.amministratori.index', compact('amministratori'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
// Gate::authorize('manage-amministratori'); // Il middleware nel costruttore è sufficiente
$usersForSelect = User::doesntHave('amministratore')->get();
// In questo metodo, non c'è un $amministratore esistente, quindi non c'è un utente associato da includere.
return view('superadmin.amministratori.create', compact('usersForSelect'));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// Gate::authorize('manage-amministratori'); // Il middleware nel costruttore è sufficiente
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users,email',
'password' => 'required|string|min:8|confirmed',
'nome' => 'required|string|max:255',
'cognome' => 'required|string|max:255',
'denominazione_studio' => 'nullable|string|max:255',
'partita_iva' => 'nullable|string|max:20|unique:amministratori,partita_iva',
'codice_fiscale_studio' => 'nullable|string|max:20',
'indirizzo_studio' => 'nullable|string|max:255',
'cap_studio' => 'nullable|string|max:10',
'citta_studio' => 'nullable|string|max:60',
'provincia_studio' => 'nullable|string|max:2',
'telefono_studio' => 'nullable|string|max:20',
'email_studio' => 'nullable|string|email|max:255',
'pec_studio' => 'nullable|string|email|max:255',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'email_verified_at' => now(),
]);
$user->assignRole('admin'); // Assegna il ruolo 'admin' al nuovo utente per coerenza con le rotte
Amministratore::create([
'user_id' => $user->id,
'nome' => $request->nome,
'cognome' => $request->cognome,
'denominazione_studio' => $request->denominazione_studio,
'partita_iva' => $request->partita_iva,
'codice_fiscale_studio' => $request->codice_fiscale_studio,
'indirizzo_studio' => $request->indirizzo_studio,
'cap_studio' => $request->cap_studio,
'citta_studio' => $request->citta_studio,
'provincia_studio' => $request->provincia_studio,
'telefono_studio' => $request->telefono_studio,
'email_studio' => $request->email_studio,
'pec_studio' => $request->pec_studio,
]);
return redirect()->route('superadmin.amministratori.index')->with('success', 'Amministratore creato con successo.');
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Amministratore $amministratore) // Aggiunto metodo edit
{
// Gate::authorize('manage-amministratori'); // Il middleware nel costruttore è sufficiente
$usersForSelect = User::doesntHave('amministratore')->get();
// Includi l'utente attualmente collegato a questo amministratore nella lista, solo se esiste
if ($amministratore->user) {
$usersForSelect->push($amministratore->user);
}
return view('superadmin.amministratori.edit', compact('amministratore', 'usersForSelect'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Amministratore $amministratore)
{
// Gate::authorize('manage-amministratori'); // Il middleware nel costruttore è sufficiente
// L'utente associato all'amministratore.
$user = $amministratore->user;
// Se per qualche motivo l'utente non esiste, non possiamo procedere.
if (!$user) {
return redirect()->route('superadmin.amministratori.index')->with('error', 'Errore: Impossibile modificare. Utente associato non trovato.');
}
$request->validate([
// Dati dell'utente associato
'name' => 'required|string|max:255',
'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
// Dati del profilo amministratore
'user_id' => ['required', 'exists:users,id', Rule::unique('amministratori')->ignore($amministratore->id_amministratore, 'id_amministratore')],
'nome' => 'required|string|max:255',
'cognome' => 'required|string|max:255',
'denominazione_studio' => 'nullable|string|max:255',
'partita_iva' => ['nullable', 'string', 'max:20', Rule::unique('amministratori')->ignore($amministratore->id_amministratore, 'id_amministratore')],
'codice_fiscale_studio' => 'nullable|string|max:20',
'indirizzo_studio' => 'nullable|string|max:255',
'cap_studio' => 'nullable|string|max:10',
'citta_studio' => 'nullable|string|max:255',
'provincia_studio' => 'nullable|string|max:2',
'telefono_studio' => 'nullable|string|max:20',
'email_studio' => 'nullable|email|max:255',
'pec_studio' => 'nullable|email|max:255',
]);
// Aggiorna i dati dell'utente associato
$user->update([
'name' => $request->name,
'email' => $request->email,
]);
// Aggiorna i dati dell'amministratore, escludendo i campi dell'utente
$amministratore->update($request->except(['name', 'email', 'password']));
return redirect()->route('superadmin.amministratori.index')->with('success', 'Amministratore aggiornato con successo.');
}
/**
* Toggle abilita_import_stabili for an amministratore.
*/
public function toggleImportAbility(Request $request, Amministratore $amministratore)
{
$this->authorize('manage-amministratori');
$enabled = !$amministratore->abilita_import_stabili;
$amministratore->abilita_import_stabili = $enabled;
$amministratore->save();
// Allinea permessi sul relativo utente per mostrare/abilitare l'area Gescon Import
if ($amministratore->user) {
$user = $amministratore->user;
if ($enabled) {
$user->givePermissionTo(['gescon-import.view', 'gescon-import.execute']);
} elseif (!$user->hasRole('super-admin')) {
// Non rimuovere i permessi a un eventuale super-admin collegato
$user->revokePermissionTo(['gescon-import.view', 'gescon-import.execute']);
}
}
return back()->with('success', 'Impostazione import stabili aggiornata.');
}
/**
* Provision a dedicated database and folders for the amministratore.
*/
public function provisionDatabase(Request $request, Amministratore $amministratore)
{
$this->authorize('manage-amministratori');
// Prefer the existing artisan command which wraps folder+db setup
try {
Artisan::call('netgescon:create-admin-structure', [
'codice' => $amministratore->codice_univoco,
'--force' => (bool)$request->boolean('force'),
]);
$output = Artisan::output();
return back()->with('success', 'Database/Cartelle provisioned.')->with('artisan_output', $output);
} catch (\Throwable $e) {
return back()->with('error', 'Errore nel provisioning: ' . $e->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Amministratore $amministratore)
{
// Gate::authorize('manage-amministratori'); // Il middleware nel costruttore è sufficiente
// Elimina l'utente associato, solo se esiste
if ($amministratore->user) {
$amministratore->user->delete();
}
$amministratore->delete();
return redirect()->route('superadmin.amministratori.index')->with('success', 'Amministratore eliminato con successo.');
}
}