@@ -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 = [];
135144if (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+
156170if (!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