Skip to content

Commit 98c289d

Browse files
committed
fix: sincronizzazione permessi
1 parent 7e19132 commit 98c289d

2 files changed

Lines changed: 37 additions & 16 deletions

File tree

modules/utenti/actions.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,12 @@
246246
$permessi['Magazzino'] = 'rw';
247247
$permessi['Articoli'] = 'rw';
248248

249+
// Rimuovi tutti i permessi esistenti
249250
$dbo->query('DELETE FROM zz_permissions WHERE idgruppo='.prepare($id_record));
250251

252+
// Ottieni il gruppo per la sincronizzazione
253+
$group = Group::find($id_record);
254+
251255
foreach ($permessi as $module_name => $permesso) {
252256
$module_id = Module::where('name', $module_name)->first()->id;
253257

@@ -256,6 +260,9 @@
256260
'idmodule' => $module_id,
257261
'permessi' => $permesso,
258262
]);
263+
264+
// Sincronizza i permessi delle viste e dei segmenti per ogni modulo
265+
$group->syncModulePermissions($module_id, $permesso);
259266
}
260267

261268
flash()->info(tr('Permessi reimpostati'));

src/Models/Group.php

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public static function getTranslatedFields()
7575
/**
7676
* Sincronizza i permessi delle viste e dei segmenti per un modulo specifico.
7777
* Se il gruppo non ha permessi sul modulo, rimuove i permessi sulle viste e segmenti.
78-
* Se il gruppo ha permessi sul modulo, aggiunge i permessi su tutte le viste e segmenti.
78+
* Se il gruppo ha permessi sul modulo, aggiunge i permessi alle viste predefinite e al segmento predefinito.
79+
* Gli Amministratori mantengono sempre accesso completo.
7980
*
8081
* @param int $id_module ID del modulo
8182
* @param string $permessi Permessi ('r', 'rw', o '-')
@@ -86,31 +87,44 @@ public function syncModulePermissions($id_module, $permessi)
8687
{
8788
$database = database();
8889

90+
// Gli Amministratori mantengono sempre accesso completo - non modificare i loro permessi
91+
if ($this->nome === 'Amministratori') {
92+
return;
93+
}
94+
8995
// Se i permessi sono di lettura o lettura/scrittura
9096
if ($permessi == 'r' || $permessi == 'rw') {
91-
// Sincronizza i permessi delle viste
92-
$count_views = $database->fetchNum('SELECT * FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module).')');
93-
94-
if (empty($count_views)) {
95-
$views = $database->fetchArray('SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module));
96-
97-
foreach ($views as $view) {
98-
$database->attach('zz_group_view', ['id_vista' => $view['id']], ['id_gruppo' => $this->id]);
97+
// Aggiungi accesso alle viste predefinite se non ce l'ha già
98+
$default_views = $database->fetchArray('SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module).' AND `default` = 1');
99+
100+
foreach ($default_views as $view) {
101+
// Controlla se il gruppo ha già accesso a questa vista specifica
102+
$has_view_access = $database->fetchNum('SELECT COUNT(*) as cont FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_vista` = '.prepare($view['id']))['cont'];
103+
104+
if ($has_view_access == 0) {
105+
$database->insert('zz_group_view', [
106+
'id_gruppo' => $this->id,
107+
'id_vista' => $view['id']
108+
]);
99109
}
100110
}
101111

102-
// Sincronizza i permessi dei segmenti
103-
$count_segments = $database->fetchNum('SELECT * FROM `zz_group_segment` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_segment` IN (SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module).')');
112+
// Aggiungi accesso ai segmenti predefiniti se non ce l'ha già
113+
$default_segments = $database->fetchArray('SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module).' AND `predefined` = 1');
104114

105-
if (empty($count_segments)) {
106-
$segments = $database->fetchArray('SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module));
115+
foreach ($default_segments as $segment) {
116+
// Controlla se il gruppo ha già accesso a questo segmento specifico
117+
$has_segment_access = $database->fetchNum('SELECT COUNT(*) as cont FROM `zz_group_segment` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_segment` = '.prepare($segment['id']))['cont'];
107118

108-
foreach ($segments as $segment) {
109-
$database->attach('zz_group_segment', ['id_segment' => $segment['id']], ['id_gruppo' => $this->id]);
119+
if ($has_segment_access == 0) {
120+
$database->insert('zz_group_segment', [
121+
'id_gruppo' => $this->id,
122+
'id_segment' => $segment['id']
123+
]);
110124
}
111125
}
112126
} else {
113-
// Se i permessi sono stati rimossi, rimuovi anche i permessi su viste e segmenti
127+
// Se i permessi sono stati rimossi, rimuovi tutti i permessi su viste e segmenti del modulo
114128
$database->query('DELETE FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module).')');
115129
$database->query('DELETE FROM `zz_group_segment` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_segment` IN (SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module).')');
116130
}

0 commit comments

Comments
 (0)