netgescon-master/_BACKUP_OLD_netgescon-laravel_INACTIVE/app/Http/Middleware/MenuPermissionMiddleware.php

409 lines
14 KiB
PHP

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
class MenuPermissionMiddleware
{
/**
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next)
{
// Inizializza sempre le variabili per evitare errori undefined
$userPermissions = ['dashboard' => false];
$userRole = 'guest';
$userRoles = [];
$activeRole = 'guest';
if (auth()->check()) {
$user = auth()->user();
// Gestione ruoli multipli
$userRoles = $this->getUserRoles($user);
$activeRole = $request->session()->get('active_role', $user->role ?? 'user');
// Se il ruolo attivo non è tra quelli disponibili, usa il primo disponibile
if (!in_array($activeRole, $userRoles)) {
$activeRole = $userRoles[0] ?? 'user';
$request->session()->put('active_role', $activeRole);
}
$userPermissions = $this->getUserPermissions($user, $activeRole);
$userRole = $activeRole;
}
// Condividi sempre le variabili con tutte le viste
View::share('userPermissions', $userPermissions);
View::share('userRole', $userRole);
View::share('userRoles', $userRoles);
View::share('activeRole', $activeRole);
return $next($request);
}
/**
* Ottiene i permessi dell'utente basati sul ruolo attivo
*/
private function getUserPermissions($user, $activeRole = null)
{
$activeRole = $activeRole ?? $user->role ?? 'user';
$permissions = [
'dashboard' => false,
'stabili' => false,
'unita' => false,
'soggetti' => false,
'contabilita' => false,
'fatture_acquisto' => false,
'fatture_emesse' => false,
'rate' => false,
'assemblee' => false,
'rubrica' => false,
'calendario' => false,
'manutentori' => false,
'amministrazione' => false,
'super_admin' => false,
'gestione_permessi' => false,
'xml_fatture' => false,
// Nuovi permessi per condomini
'area_personale' => false,
'estratto_conto' => false,
'documenti_personali' => false,
'ticket_support' => false,
'assemblee_partecipazione' => false,
'comunicazioni' => false,
'deleghe' => false,
];
// Determina i permessi in base al ruolo attivo
switch ($activeRole) {
case 'super_admin':
return array_fill_keys(array_keys($permissions), true);
case 'amministratore':
$permissions = array_merge($permissions, [
'dashboard' => true,
'stabili' => true,
'unita' => true,
'soggetti' => true,
'contabilita' => true,
'fatture_acquisto' => true,
'fatture_emesse' => true,
'rate' => true,
'assemblee' => true,
'rubrica' => true,
'calendario' => true,
'amministrazione' => true,
'gestione_permessi' => true,
'ticket_support' => true,
'comunicazioni' => true,
]);
break;
case 'contabile':
$permissions = array_merge($permissions, [
'dashboard' => true,
'contabilita' => true,
'fatture_acquisto' => true,
'soggetti' => true, // Solo per consultazione
]);
break;
case 'fatture_acquisto':
$permissions = array_merge($permissions, [
'dashboard' => true,
'fatture_acquisto' => true,
'soggetti' => true, // Solo fornitori
]);
break;
case 'fatture_emesse':
$permissions = array_merge($permissions, [
'dashboard' => true,
'fatture_emesse' => true,
'soggetti' => true, // Solo clienti
'xml_fatture' => true,
]);
break;
case 'rate_manager':
$permissions = array_merge($permissions, [
'dashboard' => true,
'rate' => true,
'soggetti' => true, // Solo condomini
'unita' => true, // Solo consultazione
]);
break;
case 'assemblee_manager':
$permissions = array_merge($permissions, [
'dashboard' => true,
'assemblee' => true,
'rubrica' => true,
'calendario' => true,
'soggetti' => true, // Solo condomini
'comunicazioni' => true,
]);
break;
case 'manutentore':
$permissions = array_merge($permissions, [
'dashboard' => true,
'manutentori' => true,
'xml_fatture' => true,
'ticket_support' => true,
]);
// Aggiungi permessi specifici per condomini assegnati
if (isset($user->assigned_stabili)) {
$permissions['stabili'] = 'limited'; // Solo stabili assegnati
$permissions['unita'] = 'limited'; // Solo unità degli stabili assegnati
}
break;
case 'collaboratore':
$permissions['dashboard'] = true;
$permissions['ticket_support'] = true;
// I permessi specifici vengono gestiti tramite la tabella user_permissions
if ($user->custom_permissions) {
$customPermissions = json_decode($user->custom_permissions, true);
$permissions = array_merge($permissions, $customPermissions);
}
break;
// NUOVI RUOLI PER CONDOMINI
case 'condomino':
case 'proprietario':
case 'inquilino':
$permissions = array_merge($permissions, [
'dashboard' => true,
'area_personale' => true,
'estratto_conto' => true,
'documenti_personali' => true,
'ticket_support' => true,
'assemblee_partecipazione' => true,
'comunicazioni' => 'read_only',
]);
// Permessi aggiuntivi per proprietari
if ($activeRole === 'proprietario') {
$permissions['deleghe'] = true;
$permissions['unita'] = 'own_only'; // Solo le proprie unità
}
break;
case 'delegato':
$permissions = array_merge($permissions, [
'dashboard' => true,
'area_personale' => true,
'estratto_conto' => 'delegated', // Solo per gli account delegati
'assemblee_partecipazione' => true,
'ticket_support' => true,
]);
break;
default:
// Utente normale - solo dashboard
$permissions['dashboard'] = true;
break;
}
return $permissions;
}
{
$permissions = [
'dashboard' => false,
'stabili' => false,
'unita' => false,
'soggetti' => false,
'contabilita' => false,
'fatture_acquisto' => false,
'fatture_emesse' => false,
'rate' => false,
'assemblee' => false,
'rubrica' => false,
'calendario' => false,
'manutentori' => false,
'amministrazione' => false,
'super_admin' => false,
'gestione_permessi' => false,
'xml_fatture' => false,
];
// Determina i permessi in base al ruolo
switch ($user->role) {
case 'super_admin':
return array_fill_keys(array_keys($permissions), true);
case 'amministratore':
$permissions = array_merge($permissions, [
'dashboard' => true,
'stabili' => true,
'unita' => true,
'soggetti' => true,
'contabilita' => true,
'fatture_acquisto' => true,
'fatture_emesse' => true,
'rate' => true,
'assemblee' => true,
'rubrica' => true,
'calendario' => true,
'amministrazione' => true,
'gestione_permessi' => true,
]);
break;
case 'contabile':
$permissions = array_merge($permissions, [
'dashboard' => true,
'contabilita' => true,
'fatture_acquisto' => true,
'soggetti' => true, // Solo per consultazione
]);
break;
case 'fatture_acquisto':
$permissions = array_merge($permissions, [
'dashboard' => true,
'fatture_acquisto' => true,
'soggetti' => true, // Solo fornitori
]);
break;
case 'fatture_emesse':
$permissions = array_merge($permissions, [
'dashboard' => true,
'fatture_emesse' => true,
'soggetti' => true, // Solo clienti
'xml_fatture' => true,
]);
break;
case 'rate_manager':
$permissions = array_merge($permissions, [
'dashboard' => true,
'rate' => true,
'soggetti' => true, // Solo condomini
'unita' => true, // Solo consultazione
]);
break;
case 'assemblee_manager':
$permissions = array_merge($permissions, [
'dashboard' => true,
'assemblee' => true,
'rubrica' => true,
'calendario' => true,
'soggetti' => true, // Solo condomini
]);
break;
case 'manutentore':
$permissions = array_merge($permissions, [
'dashboard' => true,
'manutentori' => true,
'xml_fatture' => true,
]);
// Aggiungi permessi specifici per condomini assegnati
if (isset($user->assigned_stabili)) {
$permissions['stabili'] = 'limited'; // Solo stabili assegnati
$permissions['unita'] = 'limited'; // Solo unità degli stabili assegnati
}
break;
case 'collaboratore':
$permissions['dashboard'] = true;
// I permessi specifici vengono gestiti tramite la tabella user_permissions
if ($user->custom_permissions) {
$customPermissions = json_decode($user->custom_permissions, true);
$permissions = array_merge($permissions, $customPermissions);
}
break;
default:
// Utente normale - solo dashboard
$permissions['dashboard'] = true;
break;
}
return $permissions;
}
/**
* Ottiene tutti i ruoli dell'utente (sistema ruoli multipli)
*/
private function getUserRoles($user)
{
$roles = [];
// Ruolo principale dell'utente
if ($user->role) {
$roles[] = $user->role;
}
// Se l'utente è anche un condomino, aggiungi il ruolo 'condomino'
if ($this->isCondomino($user)) {
$roles[] = 'condomino';
}
// Se l'utente è anche un proprietario, aggiungi il ruolo 'proprietario'
if ($this->isProprietario($user)) {
$roles[] = 'proprietario';
}
// Se l'utente è anche un inquilino, aggiungi il ruolo 'inquilino'
if ($this->isInquilino($user)) {
$roles[] = 'inquilino';
}
// Se l'utente ha deleghe da altri condomini
if ($this->hasDeleghe($user)) {
$roles[] = 'delegato';
}
return array_unique($roles);
}
/**
* Verifica se l'utente è un condomino
*/
private function isCondomino($user)
{
// Verifica se l'utente ha unità immobiliari associate
return $user->unita_immobiliari()->exists()
|| $user->contratti_proprietario()->exists()
|| $user->contratti_inquilino()->exists();
}
/**
* Verifica se l'utente è un proprietario
*/
private function isProprietario($user)
{
return $user->contratti_proprietario()->exists();
}
/**
* Verifica se l'utente è un inquilino
*/
private function isInquilino($user)
{
return $user->contratti_inquilino()->exists();
}
/**
* Verifica se l'utente ha deleghe da altri condomini
*/
private function hasDeleghe($user)
{
// Implementare logica per verificare deleghe
return false; // TODO: implementare quando avremo la tabella deleghe
}
}