211 lines
6.5 KiB
PHP
211 lines
6.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
class PermissionController extends Controller
|
|
{
|
|
/**
|
|
* Lista utenti e permessi
|
|
*/
|
|
public function index()
|
|
{
|
|
$users = User::with('stabili')->paginate(15);
|
|
$roles = $this->getAvailableRoles();
|
|
|
|
return view('admin.permissions.index', compact('users', 'roles'));
|
|
}
|
|
|
|
/**
|
|
* Mostra form di modifica permessi utente
|
|
*/
|
|
public function edit(User $user)
|
|
{
|
|
$roles = $this->getAvailableRoles();
|
|
$permissions = $this->getAllPermissions();
|
|
$userPermissions = json_decode($user->custom_permissions ?? '{}', true);
|
|
|
|
return view('admin.permissions.edit', compact('user', 'roles', 'permissions', 'userPermissions'));
|
|
}
|
|
|
|
/**
|
|
* Aggiorna permessi utente
|
|
*/
|
|
public function update(Request $request, User $user)
|
|
{
|
|
$request->validate([
|
|
'role' => 'required|in:' . implode(',', array_keys($this->getAvailableRoles())),
|
|
'permissions' => 'array',
|
|
'assigned_stabili' => 'array',
|
|
]);
|
|
|
|
// Aggiorna ruolo
|
|
$user->role = $request->role;
|
|
|
|
// Aggiorna permessi personalizzati per collaboratori
|
|
if ($request->role === 'collaboratore') {
|
|
$customPermissions = [];
|
|
if ($request->permissions) {
|
|
foreach ($request->permissions as $permission) {
|
|
$customPermissions[$permission] = true;
|
|
}
|
|
}
|
|
$user->custom_permissions = json_encode($customPermissions);
|
|
} else {
|
|
$user->custom_permissions = null;
|
|
}
|
|
|
|
// Aggiorna stabili assegnati per manutentori
|
|
if ($request->role === 'manutentore' && $request->assigned_stabili) {
|
|
$user->assigned_stabili = json_encode($request->assigned_stabili);
|
|
} else {
|
|
$user->assigned_stabili = null;
|
|
}
|
|
|
|
$user->save();
|
|
|
|
return redirect()->route('admin.permissions.index')
|
|
->with('success', 'Permessi aggiornati con successo per ' . $user->name);
|
|
}
|
|
|
|
/**
|
|
* Crea nuovo utente con permessi
|
|
*/
|
|
public function create()
|
|
{
|
|
$roles = $this->getAvailableRoles();
|
|
$permissions = $this->getAllPermissions();
|
|
|
|
return view('admin.permissions.create', compact('roles', 'permissions'));
|
|
}
|
|
|
|
/**
|
|
* Salva nuovo utente
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'name' => 'required|string|max:255',
|
|
'email' => 'required|email|unique:users',
|
|
'password' => 'required|min:8|confirmed',
|
|
'role' => 'required|in:' . implode(',', array_keys($this->getAvailableRoles())),
|
|
'permissions' => 'array',
|
|
'assigned_stabili' => 'array',
|
|
]);
|
|
|
|
$user = User::create([
|
|
'name' => $request->name,
|
|
'email' => $request->email,
|
|
'password' => Hash::make($request->password),
|
|
'role' => $request->role,
|
|
]);
|
|
|
|
// Gestione permessi personalizzati
|
|
if ($request->role === 'collaboratore' && $request->permissions) {
|
|
$customPermissions = [];
|
|
foreach ($request->permissions as $permission) {
|
|
$customPermissions[$permission] = true;
|
|
}
|
|
$user->custom_permissions = json_encode($customPermissions);
|
|
}
|
|
|
|
// Gestione stabili assegnati
|
|
if ($request->role === 'manutentore' && $request->assigned_stabili) {
|
|
$user->assigned_stabili = json_encode($request->assigned_stabili);
|
|
}
|
|
|
|
$user->save();
|
|
|
|
return redirect()->route('admin.permissions.index')
|
|
->with('success', 'Utente creato con successo: ' . $user->name);
|
|
}
|
|
|
|
/**
|
|
* Impersonifica utente (solo super admin)
|
|
*/
|
|
public function impersonate(User $user)
|
|
{
|
|
if (auth()->user()->role !== 'super_admin') {
|
|
abort(403, 'Non autorizzato');
|
|
}
|
|
|
|
session(['impersonating' => $user->id]);
|
|
session(['original_user' => auth()->id()]);
|
|
|
|
auth()->login($user);
|
|
|
|
return redirect()->route('dashboard')
|
|
->with('warning', 'Stai impersonificando: ' . $user->name . '. Clicca per tornare al tuo account.');
|
|
}
|
|
|
|
/**
|
|
* Termina impersonificazione
|
|
*/
|
|
public function stopImpersonating()
|
|
{
|
|
if (!session('impersonating')) {
|
|
return redirect()->route('dashboard');
|
|
}
|
|
|
|
$originalUserId = session('original_user');
|
|
session()->forget(['impersonating', 'original_user']);
|
|
|
|
if ($originalUserId) {
|
|
$originalUser = User::find($originalUserId);
|
|
if ($originalUser) {
|
|
auth()->login($originalUser);
|
|
}
|
|
}
|
|
|
|
return redirect()->route('admin.permissions.index')
|
|
->with('success', 'Impersonificazione terminata');
|
|
}
|
|
|
|
/**
|
|
* Ruoli disponibili nel sistema
|
|
*/
|
|
private function getAvailableRoles()
|
|
{
|
|
return [
|
|
'user' => 'Utente Base',
|
|
'collaboratore' => 'Collaboratore (Permessi Personalizzati)',
|
|
'contabile' => 'Responsabile Contabilità',
|
|
'fatture_acquisto' => 'Gestione Fatture Acquisto',
|
|
'fatture_emesse' => 'Gestione Fatture Emesse',
|
|
'rate_manager' => 'Gestione Rate e Pagamenti',
|
|
'assemblee_manager' => 'Gestione Assemblee',
|
|
'manutentore' => 'Manutentore',
|
|
'amministratore' => 'Amministratore',
|
|
'super_admin' => 'Super Amministratore',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Tutti i permessi disponibili
|
|
*/
|
|
private function getAllPermissions()
|
|
{
|
|
return [
|
|
'dashboard' => 'Dashboard',
|
|
'stabili' => 'Gestione Stabili',
|
|
'unita' => 'Unità Immobiliari',
|
|
'soggetti' => 'Gestione Soggetti',
|
|
'contabilita' => 'Contabilità',
|
|
'fatture_acquisto' => 'Fatture Acquisto',
|
|
'fatture_emesse' => 'Fatture Emesse',
|
|
'rate' => 'Gestione Rate',
|
|
'assemblee' => 'Assemblee',
|
|
'rubrica' => 'Rubrica',
|
|
'calendario' => 'Calendario',
|
|
'manutentori' => 'Area Manutentori',
|
|
'xml_fatture' => 'Preparazione XML Fatture',
|
|
'amministrazione' => 'Amministrazione',
|
|
'gestione_permessi' => 'Gestione Permessi Utenti',
|
|
];
|
|
}
|
|
}
|