@@ -36,24 +36,181 @@ public function getType($record)
3636
3737 public function check ()
3838 {
39- $ duplicati = database ()->fetchArray ('SELECT `id_module`, `title` FROM `zz_views` LEFT JOIN `zz_views_lang` ON (`zz_views`.`id` = `zz_views_lang`.`id_record` AND `zz_views_lang`.`id_lang` = ' .prepare (\Models \Locale::getDefault ()->id ).') GROUP BY `id_module`, `title` HAVING COUNT(`title`) > 1 ' );
39+ // 1. Controllo duplicati nel campo 'name' della tabella zz_views
40+ $ duplicati_name = database ()->fetchArray ('
41+ SELECT `id_module`, `name`, COUNT(*) as `count`
42+ FROM `zz_views`
43+ WHERE `name` IS NOT NULL AND `name` != ""
44+ GROUP BY `id_module`, `name`
45+ HAVING COUNT(*) > 1
46+ ' );
4047
41- foreach ($ duplicati as $ colonna ) {
48+ foreach ($ duplicati_name as $ colonna ) {
4249 $ modulo = Module::find ($ colonna ['id_module ' ]);
4350
4451 $ this ->addResult ([
45- 'id ' => $ colonna ['title ' ],
46- 'nome ' => $ modulo ->getTranslation ('title ' ). ': ' . $ colonna ['title ' ] ,
47- 'descrizione ' => tr ('La colonna _NAME_ del modulo _MODULE_ esiste più volte ' , [
48- '_NAME_ ' => $ colonna ['title ' ],
52+ 'id ' => ' name_ ' . $ colonna ['id_module ' ] . ' _ ' . $ colonna [ ' name ' ],
53+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ colonna ['name ' ] . ' (name) ' ,
54+ 'descrizione ' => tr ('La colonna _NAME_ del modulo _MODULE_ esiste _COUNT_ volte nella tabella zz_views (campo name) ' , [
55+ '_NAME_ ' => $ colonna ['name ' ],
4956 '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
57+ '_COUNT_ ' => $ colonna ['count ' ],
5058 ]),
5159 ]);
5260 }
61+
62+ // 2. Controllo viste diverse con stesso title nello stesso modulo e lingua
63+ $ duplicati_title_diverse = database ()->fetchArray ('
64+ SELECT `zz_views`.`id_module`, `zz_views_lang`.`title`, `zz_views_lang`.`id_lang`,
65+ COUNT(DISTINCT `zz_views_lang`.`id_record`) as `count_viste`,
66+ GROUP_CONCAT(DISTINCT `zz_views`.`name`) as `nomi_viste`
67+ FROM `zz_views_lang`
68+ INNER JOIN `zz_views` ON `zz_views`.`id` = `zz_views_lang`.`id_record`
69+ WHERE `zz_views_lang`.`title` IS NOT NULL AND `zz_views_lang`.`title` != ""
70+ GROUP BY `zz_views`.`id_module`, `zz_views_lang`.`title`, `zz_views_lang`.`id_lang`
71+ HAVING COUNT(DISTINCT `zz_views_lang`.`id_record`) > 1
72+ ' );
73+
74+ foreach ($ duplicati_title_diverse as $ colonna ) {
75+ $ modulo = Module::find ($ colonna ['id_module ' ]);
76+ $ lingua = database ()->fetchOne ('SELECT `name` FROM `zz_langs` WHERE `id` = ' .prepare ($ colonna ['id_lang ' ]));
77+
78+ // Estrai solo la parte principale del nome della lingua (es. "English" da "English (English)")
79+ $ nome_lingua = explode (' ( ' , $ lingua ['name ' ])[0 ];
80+
81+ $ this ->addResult ([
82+ 'id ' => 'title_diverse_ ' . $ colonna ['id_module ' ] . '_ ' . $ colonna ['id_lang ' ] . '_ ' . md5 ($ colonna ['title ' ]),
83+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ colonna ['title ' ] . ' ( ' . $ nome_lingua . ') ' ,
84+ 'descrizione ' => tr ('Il titolo "_TITLE_" del modulo _MODULE_ è usato da _COUNT_ viste diverse (_VIEWS_) nella lingua _LANG_ ' , [
85+ '_TITLE_ ' => $ colonna ['title ' ],
86+ '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
87+ '_COUNT_ ' => $ colonna ['count_viste ' ],
88+ '_VIEWS_ ' => $ colonna ['nomi_viste ' ],
89+ '_LANG_ ' => $ nome_lingua ,
90+ ]),
91+ ]);
92+ }
93+
94+ // 3. Controllo record duplicati in zz_views_lang con stesso id_record e id_lang
95+ $ duplicati_record_lang = database ()->fetchArray ('
96+ SELECT `zz_views`.`id_module`, `zz_views_lang`.`id_record`, `zz_views_lang`.`id_lang`, COUNT(*) as `count`
97+ FROM `zz_views_lang`
98+ INNER JOIN `zz_views` ON `zz_views`.`id` = `zz_views_lang`.`id_record`
99+ GROUP BY `zz_views_lang`.`id_record`, `zz_views_lang`.`id_lang`
100+ HAVING COUNT(*) > 1
101+ ' );
102+
103+ foreach ($ duplicati_record_lang as $ colonna ) {
104+ $ modulo = Module::find ($ colonna ['id_module ' ]);
105+ $ lingua = database ()->fetchOne ('SELECT `name` FROM `zz_langs` WHERE `id` = ' .prepare ($ colonna ['id_lang ' ]));
106+ $ vista = database ()->fetchOne ('SELECT `name` FROM `zz_views` WHERE `id` = ' .prepare ($ colonna ['id_record ' ]));
107+
108+ // Estrai solo la parte principale del nome della lingua (es. "English" da "English (English)")
109+ $ nome_lingua = explode (' ( ' , $ lingua ['name ' ])[0 ];
110+
111+ $ this ->addResult ([
112+ 'id ' => 'record_lang_ ' . $ colonna ['id_record ' ] . '_ ' . $ colonna ['id_lang ' ],
113+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ vista ['name ' ] . ' ( ' . $ nome_lingua . ') ' ,
114+ 'descrizione ' => tr ('La vista _NAME_ del modulo _MODULE_ ha _COUNT_ traduzioni duplicate per la lingua _LANG_ ' , [
115+ '_NAME_ ' => $ vista ['name ' ],
116+ '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
117+ '_COUNT_ ' => $ colonna ['count ' ],
118+ '_LANG_ ' => $ nome_lingua ,
119+ ]),
120+ ]);
121+ }
122+ }
123+
124+ /**
125+ * Indica se questo controllo supporta azioni globali
126+ */
127+ public function hasGlobalActions ()
128+ {
129+ return true ;
53130 }
54131
55132 public function execute ($ record , $ params = [])
56133 {
57- return false ;
134+ // La risoluzione singola non è supportata per questo controllo
135+ // Utilizzare solo la risoluzione globale tramite il pulsante "Risolvi tutti i conflitti"
136+ throw new \Exception (tr ('La risoluzione singola non è supportata. Utilizzare la risoluzione globale. ' ));
137+ }
138+
139+ /**
140+ * Risolve tutti i conflitti eliminando i record più vecchi e mantenendo quello più recente
141+ */
142+ public function solveGlobal ($ params = [])
143+ {
144+ $ results = [];
145+ $ database = database ();
146+
147+ try {
148+ // 1. Risolvi duplicati nel campo 'name' della tabella zz_views
149+ $ duplicati_name = $ database ->fetchArray ('
150+ SELECT `id`, `id_module`, `name`, `created_at`
151+ FROM `zz_views`
152+ WHERE `name` IS NOT NULL AND `name` != ""
153+ AND (`id_module`, `name`) IN (
154+ SELECT `id_module`, `name`
155+ FROM `zz_views`
156+ WHERE `name` IS NOT NULL AND `name` != ""
157+ GROUP BY `id_module`, `name`
158+ HAVING COUNT(*) > 1
159+ )
160+ ORDER BY `id_module`, `name`, `id` DESC
161+ ' );
162+
163+ $ grouped_name = [];
164+ foreach ($ duplicati_name as $ record ) {
165+ $ key = $ record ['id_module ' ] . '_ ' . $ record ['name ' ];
166+ $ grouped_name [$ key ][] = $ record ;
167+ }
168+
169+ foreach ($ grouped_name as $ group ) {
170+ if (count ($ group ) > 1 ) {
171+ // Mantieni il primo record (più recente per ID) ed elimina gli altri
172+ for ($ i = 1 ; $ i < count ($ group ); $ i ++) {
173+ $ database ->query ('DELETE FROM `zz_views` WHERE `id` = ' . prepare ($ group [$ i ]['id ' ]));
174+ $ results ['name_ ' . $ group [$ i ]['id ' ]] = true ;
175+ }
176+ }
177+ }
178+
179+ // 2. Risolvi record duplicati in zz_views_lang con stesso id_record e id_lang
180+ $ duplicati_record_lang = $ database ->fetchArray ('
181+ SELECT `id`, `id_record`, `id_lang`
182+ FROM `zz_views_lang`
183+ WHERE (`id_record`, `id_lang`) IN (
184+ SELECT `id_record`, `id_lang`
185+ FROM `zz_views_lang`
186+ GROUP BY `id_record`, `id_lang`
187+ HAVING COUNT(*) > 1
188+ )
189+ ORDER BY `id_record`, `id_lang`, `id` DESC
190+ ' );
191+
192+ $ grouped_record_lang = [];
193+ foreach ($ duplicati_record_lang as $ record ) {
194+ $ key = $ record ['id_record ' ] . '_ ' . $ record ['id_lang ' ];
195+ $ grouped_record_lang [$ key ][] = $ record ;
196+ }
197+
198+ foreach ($ grouped_record_lang as $ group ) {
199+ if (count ($ group ) > 1 ) {
200+ // Mantieni il primo record (più recente per ID) ed elimina gli altri
201+ for ($ i = 1 ; $ i < count ($ group ); $ i ++) {
202+ $ database ->query ('DELETE FROM `zz_views_lang` WHERE `id` = ' . prepare ($ group [$ i ]['id ' ]));
203+ $ results ['record_lang_ ' . $ group [$ i ]['id ' ]] = true ;
204+ }
205+ }
206+ }
207+
208+ return $ results ;
209+
210+ } catch (\Exception $ e ) {
211+ throw new \Exception (tr ('Errore durante la risoluzione dei conflitti: _ERROR_ ' , [
212+ '_ERROR_ ' => $ e ->getMessage (),
213+ ]));
214+ }
58215 }
59216}
0 commit comments