netgescon-master/netgescon-laravel/app/Http/Controllers/Admin/PermissionController.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',
];
}
}