Skip to content

Commit 96bea3e

Browse files
committed
fix: miglioria controlli integrità moduli premium
1 parent 8bec77a commit 96bea3e

5 files changed

Lines changed: 381 additions & 38 deletions

File tree

modules/aggiornamenti/database.php

Lines changed: 147 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -100,36 +100,45 @@ function settings_diff($expected, $current)
100100
}
101101

102102
// Funzione per ottenere il nome del modulo dal file di riferimento appropriato
103-
function getModuleNameFromReference($reference_file, $folder_name, $modules_json_data) {
104-
$module_name = $folder_name; // Default: usa il nome della cartella
105-
106-
// Verifica se esiste il file di riferimento
107-
if (file_exists($reference_file)) {
108-
$reference_contents = file_get_contents($reference_file);
109-
$reference_data = json_decode($reference_contents, true);
103+
if (!function_exists('getModuleNameFromReference')) {
104+
function getModuleNameFromReference($reference_file, $folder_name, $modules_json_data) {
105+
$module_name = $folder_name; // Default: usa il nome della cartella
110106

111-
if (!empty($reference_data) && is_array($reference_data)) {
112-
foreach ($reference_data as $name => $module_info) {
113-
// Cerca una corrispondenza parziale o esatta
114-
if (stripos(strtolower($folder_name), strtolower($name)) !== false) {
115-
$module_name = $name;
116-
break;
117-
}
118-
// Seconda prova: cerca se il nome del modulo (senza spazi) è contenuto nel nome della cartella
119-
if (stripos(strtolower($folder_name), strtolower(str_replace(' ', '', $name))) !== false) {
120-
$module_name = $name;
121-
break;
107+
// Verifica se esiste il file di riferimento
108+
if (file_exists($reference_file)) {
109+
$reference_contents = file_get_contents($reference_file);
110+
$reference_data = json_decode($reference_contents, true);
111+
112+
if (!empty($reference_data) && is_array($reference_data)) {
113+
foreach ($reference_data as $name => $module_info) {
114+
// Cerca una corrispondenza parziale o esatta
115+
if (stripos(strtolower($folder_name), strtolower($name)) !== false) {
116+
$module_name = $name;
117+
break;
118+
}
119+
// Seconda prova: cerca se il nome del modulo (senza spazi) è contenuto nel nome della cartella
120+
if (stripos(strtolower($folder_name), strtolower(str_replace(' ', '', $name))) !== false) {
121+
$module_name = $name;
122+
break;
123+
}
122124
}
123125
}
124126
}
127+
128+
return $module_name;
125129
}
126-
127-
return $module_name;
128130
}
129131

130132
// Traccia da quale modulo proviene ogni campo (per identificare i campi premium)
131133
$premium_fields = [];
132134

135+
// NOTA: Il controllo delle chiavi esterne è stato migliorato per confrontare il contenuto
136+
// invece del nome. Questo risolve il problema in cui chiavi esterne con lo stesso
137+
// contenuto ma nomi diversi venivano segnalate come "non previste".
138+
// Le funzioni IntegrityChecker::foreignKeyExistsByContent() e IntegrityChecker::getForeignKeyHash()
139+
// vengono utilizzate per confrontare le chiavi esterne basandosi sul loro contenuto
140+
// (colonna, tabella di riferimento, colonna di riferimento, regole di delete/update).
141+
133142
// Carica il file di riferimento principale per il database
134143
$data = [];
135144
if (file_exists(base_dir().'/'.$file_to_check_database)) {
@@ -153,6 +162,11 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
153162
$modules_dir = base_dir().'/modules/';
154163
$database_json_files = glob($modules_dir.'*/'.$file_to_check_database);
155164

165+
// Se non sono stati trovati file con il nome specifico per la versione del database, cerca anche mysql.json di default
166+
if (empty($database_json_files) && $file_to_check_database !== 'mysql.json') {
167+
$database_json_files = glob($modules_dir.'*/mysql.json');
168+
}
169+
156170
if (!empty($database_json_files)) {
157171
foreach ($database_json_files as $database_json_file) {
158172
$database_contents = file_get_contents($database_json_file);
@@ -167,7 +181,40 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
167181
$module_name = getModuleNameFromReference($modules_json_file, $folder_name, $modules_json_data);
168182

169183
// Accoda le definizioni del modulo a quelle principali
170-
$data = array_merge($data, $database_data);
184+
// Unisci i campi delle tabelle invece di sovrascrivere le tabelle intere
185+
foreach ($database_data as $table => $table_data) {
186+
if (!isset($data[$table])) {
187+
// Se la tabella non esiste, aggiungila
188+
$data[$table] = $table_data;
189+
} else {
190+
// Se la tabella esiste, unisci i campi
191+
foreach ($table_data as $field_name => $field_data) {
192+
if ($field_name === 'foreign_keys' && is_array($field_data)) {
193+
// Unisci le chiavi esterne
194+
if (!isset($data[$table]['foreign_keys'])) {
195+
$data[$table]['foreign_keys'] = [];
196+
}
197+
// Unisci le chiavi esterne senza sovrascrivere quelle esistenti
198+
foreach ($field_data as $fk_name => $fk_data) {
199+
if (!isset($data[$table]['foreign_keys'][$fk_name])) {
200+
$data[$table]['foreign_keys'][$fk_name] = $fk_data;
201+
}
202+
}
203+
} elseif (is_array($field_data)) {
204+
// Unisci i campi della tabella
205+
if (!isset($data[$table][$field_name])) {
206+
$data[$table][$field_name] = $field_data;
207+
} else {
208+
// Se il campo esiste, unisci i dati (array_merge ricorsivo)
209+
$data[$table][$field_name] = array_merge($data[$table][$field_name], $field_data);
210+
}
211+
} else {
212+
// Se non è un array, sovrascrivi
213+
$data[$table][$field_name] = $field_data;
214+
}
215+
}
216+
}
217+
}
171218

172219
// Traccia i campi provenienti da questo modulo premium
173220
foreach ($database_data as $table => $table_data) {
@@ -257,11 +304,16 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
257304
$error_count = 1;
258305
$danger_count = 1;
259306
} else {
260-
// Conta i tipi di errori
307+
// Conta i tipi di errori (escludendo i campi premium)
261308
foreach ($errors as $name => $diff) {
262309
if ($name === 'foreign_keys') {
263310
continue;
264311
}
312+
// Verifica se il campo proviene da un modulo premium
313+
if (isset($premium_fields[$table][$name])) {
314+
// Salta i campi premium - verranno mostrati nella sezione "Campi modulo premium"
315+
continue;
316+
}
265317
if (array_key_exists('key', $diff)) {
266318
if ($diff['key']['expected'] == '') {
267319
++$info_count;
@@ -280,7 +332,11 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
280332
if (is_array($diff) && isset($diff['expected'])) {
281333
++$danger_count;
282334
} elseif (is_array($diff) && isset($diff['current'])) {
283-
++$info_count;
335+
// Verifica se la chiave esterna esiste per contenuto nelle chiavi attese
336+
$expected_fks = isset($data[$table]['foreign_keys']) ? $data[$table]['foreign_keys'] : [];
337+
if (!IntegrityChecker::foreignKeyExistsByContent($diff['current'], $expected_fks)) {
338+
++$info_count;
339+
}
284340
} else {
285341
++$warning_count;
286342
}
@@ -289,6 +345,11 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
289345
$error_count = $danger_count + $warning_count + $info_count;
290346
}
291347

348+
// Non mostrare la sezione se non ci sono errori da visualizzare
349+
if ($error_count == 0) {
350+
continue;
351+
}
352+
292353
$badge_html = Utils::generateBadgeHtml($danger_count, $warning_count, $info_count);
293354
$border_color = Utils::determineBorderColor($danger_count, $warning_count);
294355

@@ -308,7 +369,19 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
308369
<div class="alert alert-danger alert-database mb-2"><i class="fa fa-times"></i> '.tr('Tabella assente').'
309370
</div>';
310371
} else {
311-
if (!empty($errors) || !empty($foreign_keys)) {
372+
// Calcola il numero di errori non premium prima di mostrare la tabella
373+
$non_premium_errors = 0;
374+
foreach ($errors as $name => $diff) {
375+
if ($name === 'foreign_keys') {
376+
continue;
377+
}
378+
// Verifica se il campo proviene da un modulo premium
379+
if (!isset($premium_fields[$table][$name])) {
380+
$non_premium_errors++;
381+
}
382+
}
383+
384+
if ($non_premium_errors > 0 || !empty($foreign_keys)) {
312385
echo '
313386
<div class="table-responsive">
314387
<table class="table table-hover table-striped table-sm">
@@ -325,6 +398,11 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
325398
if ($name === 'foreign_keys') {
326399
continue;
327400
}
401+
// Verifica se il campo proviene da un modulo premium
402+
if (isset($premium_fields[$table][$name])) {
403+
// Salta i campi premium - verranno mostrati nella sezione "Campi modulo premium"
404+
continue;
405+
}
328406
$query = '';
329407
$null = '';
330408
$badge_text = '';
@@ -376,11 +454,11 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
376454
$query .= $data[$table][$name]['type'];
377455

378456
if ($data[$table][$name]['null'] == 'NO') {
379-
$null = 'NOT NULL';
457+
$null = ' NOT NULL';
380458
} else {
381-
$null = 'NULL';
459+
$null = ' NULL';
382460
}
383-
$query .= str_replace('DEFAULT_GENERATED', ' ', $data[$table][$name]['extra']).' '.$null;
461+
$query .= str_replace('DEFAULT_GENERATED', ' ', ' '.$data[$table][$name]['extra']).' '.$null;
384462
if ($data[$table][$name]['default']) {
385463
$query .= ' DEFAULT '.$data[$table][$name]['default'];
386464
}
@@ -407,7 +485,7 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
407485
$fk_name = $name;
408486
$badge_text = '';
409487
$badge_color = '';
410-
488+
411489
// Gestione delle chiavi esterne
412490
if (is_array($diff) && isset($diff['expected'])) {
413491
// Chiave esterna mancante (presente in expected ma non in current)
@@ -419,6 +497,12 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
419497
}
420498
} elseif (is_array($diff) && isset($diff['current'])) {
421499
// Chiave esterna in più (presente in current ma non in expected)
500+
// Verifica se la chiave esterna esiste per contenuto nelle chiavi attese
501+
$expected_fks = isset($data[$table]['foreign_keys']) ? $data[$table]['foreign_keys'] : [];
502+
if (IntegrityChecker::foreignKeyExistsByContent($diff['current'], $expected_fks)) {
503+
// La chiave esterna esiste per contenuto, non segnalarla come non prevista
504+
continue;
505+
}
422506
$query = 'Chiave esterna non prevista';
423507
$badge_text = 'Chiave esterna non prevista';
424508
$badge_color = 'info';
@@ -475,7 +559,20 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
475559

476560
// Calcola il conteggio corretto includendo tutti i tipi di errori
477561
$keys_count = ($has_keys ? count(array_filter($errors, fn ($e) => isset($e['key']))) : 0);
478-
$foreign_keys_count = count($foreign_keys);
562+
563+
// Filtra le chiavi esterne che esistono per contenuto
564+
$expected_fks = isset($data[$table]['foreign_keys']) ? $data[$table]['foreign_keys'] : [];
565+
$foreign_keys_count = 0;
566+
foreach ($foreign_keys as $name => $diff) {
567+
if (is_array($diff) && isset($diff['current'])) {
568+
// Verifica se la chiave esterna esiste per contenuto nelle chiavi attese
569+
if (!IntegrityChecker::foreignKeyExistsByContent($diff['current'], $expected_fks)) {
570+
++$foreign_keys_count;
571+
}
572+
} else {
573+
++$foreign_keys_count;
574+
}
575+
}
479576

480577
// Conta i campi non previsti (escludendo le chiavi, le chiavi esterne e i campi premium)
481578
$fields_count = 0;
@@ -490,7 +587,8 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
490587

491588
$error_count = $keys_count + $foreign_keys_count + $fields_count;
492589

493-
if ($table_not_expected || $has_keys || !empty($foreign_keys) || $fields_count > 0) {
590+
// Mostra la sezione solo se ci sono errori reali (escludendo i campi premium)
591+
if ($error_count > 0) {
494592
echo '
495593
<div class="mb-3">
496594
<div class="d-flex align-items-center justify-content-between p-2 module-aggiornamenti db-section-header-dynamic" onclick="$(this).next().slideToggle();">
@@ -509,7 +607,18 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
509607
} else {
510608
unset($errors['foreign_keys']);
511609

512-
if ($has_keys || !empty($foreign_keys)) {
610+
// Calcola il numero di chiavi non premium prima di mostrare la tabella
611+
$non_premium_keys = 0;
612+
foreach ($errors as $name => $diff) {
613+
if ($name != 'foreign_keys' && !isset($results[$table][$name]) && isset($diff['key'])) {
614+
// Verifica se il campo proviene da un modulo premium
615+
if (!isset($premium_fields[$table][$name])) {
616+
$non_premium_keys++;
617+
}
618+
}
619+
}
620+
621+
if ($non_premium_keys > 0 || !empty($foreign_keys) || $fields_count > 0) {
513622
echo '
514623
<div class="table-responsive">
515624
<table class="table table-hover table-striped table-sm">
@@ -578,10 +687,16 @@ function getModuleNameFromReference($reference_file, $folder_name, $modules_json
578687
$fk_name = $name;
579688
$badge_text = '';
580689
$badge_color = '';
581-
690+
582691
// Gestione delle chiavi esterne in più
583692
if (is_array($diff) && isset($diff['current'])) {
584693
// Chiave esterna in più (presente in current ma non in expected)
694+
// Verifica se la chiave esterna esiste per contenuto nelle chiavi attese
695+
$expected_fks = isset($data[$table]['foreign_keys']) ? $data[$table]['foreign_keys'] : [];
696+
if (IntegrityChecker::foreignKeyExistsByContent($diff['current'], $expected_fks)) {
697+
// La chiave esterna esiste per contenuto, non segnalarla come non prevista
698+
continue;
699+
}
585700
if (is_array($diff['current'])) {
586701
$query = 'ALTER TABLE '.$table.' DROP FOREIGN KEY '.$name.';';
587702
$query_conflitti[] = $query;

0 commit comments

Comments
 (0)