Skip to content

Commit 5ee3e1d

Browse files
committed
feat: risoluzione conflitti plugin duplicati
1 parent ee69a2a commit 5ee3e1d

2 files changed

Lines changed: 177 additions & 10 deletions

File tree

modules/aggiornamenti/controlli.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,8 @@ function hasGlobalActions(controllo) {
308308
const controlliConAzioniGlobali = [
309309
"Modules\\\\Aggiornamenti\\\\Controlli\\\\PianoContiRagioneSociale",
310310
"Modules\\\\Aggiornamenti\\\\Controlli\\\\ReaValidi",
311-
"Modules\\\\Aggiornamenti\\\\Controlli\\\\ColonneDuplicateViste"
311+
"Modules\\\\Aggiornamenti\\\\Controlli\\\\ColonneDuplicateViste",
312+
"Modules\\\\Aggiornamenti\\\\Controlli\\\\PluginDuplicati"
312313
];
313314
314315
return controlliConAzioniGlobali.includes(controllo["class"]);
@@ -351,6 +352,17 @@ function getMessaggioConferma(controlloClass) {
351352
"'.tr('Le viste duplicate verranno rimosse definitivamente dal database').'",
352353
"'.tr('Non può essere annullata').'"
353354
]
355+
},
356+
"Modules\\\\Aggiornamenti\\\\Controlli\\\\PluginDuplicati": {
357+
titolo: "'.tr('Conferma risoluzione conflitti plugin').'",
358+
descrizione: "'.tr('Sei sicuro di voler risolvere tutti i conflitti dei plugin duplicati?').'",
359+
operazioni: [
360+
"'.tr('Eliminerà i record duplicati nelle tabelle zz_plugins e zz_plugins_lang').'",
361+
"'.tr('Manterrà sempre il record più recente (con ID maggiore) ed eliminerà gli altri').'",
362+
"'.tr('I record eliminati non potranno essere recuperati').'",
363+
"'.tr('I plugin duplicati verranno rimossi definitivamente dal database').'",
364+
"'.tr('Non può essere annullata').'"
365+
]
354366
}
355367
};
356368

modules/aggiornamenti/src/Controlli/PluginDuplicati.php

Lines changed: 164 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
namespace Modules\Aggiornamenti\Controlli;
2222

2323
use Models\Module;
24-
use Models\Plugin;
2524

2625
class PluginDuplicati extends Controllo
2726
{
@@ -37,25 +36,181 @@ public function getType($record)
3736

3837
public function check()
3938
{
40-
$duplicati = database()->fetchArray('SELECT `idmodule_to`, `title`, `zz_plugins`.`id` FROM `zz_plugins` LEFT JOIN `zz_plugins_lang` ON (`zz_plugins`.`id` = `zz_plugins_lang`.`id_record` AND `zz_plugins_lang`.`id_lang` = '.prepare(\Models\Locale::getDefault()->id).') GROUP BY `idmodule_to`, `title` HAVING COUNT(`title`) > 1');
39+
// 1. Controllo duplicati nel campo 'name' della tabella zz_plugins
40+
$duplicati_name = database()->fetchArray('
41+
SELECT `idmodule_to`, `name`, COUNT(*) as `count`
42+
FROM `zz_plugins`
43+
WHERE `name` IS NOT NULL AND `name` != ""
44+
GROUP BY `idmodule_to`, `name`
45+
HAVING COUNT(*) > 1
46+
');
4147

42-
foreach ($duplicati as $plugin) {
48+
foreach ($duplicati_name as $plugin) {
4349
$modulo = Module::find($plugin['idmodule_to']);
44-
$plugin = Plugin::find($plugin['id']);
4550

4651
$this->addResult([
47-
'id' => $plugin->id,
48-
'nome' => $modulo->getTranslation('title').': '.$plugin->getTranslation('title'),
49-
'descrizione' => tr('Il plugin _NAME_ del modulo _MODULE_ esiste più volte', [
50-
'_NAME_' => $plugin->getTranslation('title'),
52+
'id' => 'name_' . $plugin['idmodule_to'] . '_' . $plugin['name'],
53+
'nome' => $modulo->getTranslation('title') . ': ' . $plugin['name'] . ' (name)',
54+
'descrizione' => tr('Il plugin _NAME_ del modulo _MODULE_ esiste _COUNT_ volte nella tabella zz_plugins (campo name)', [
55+
'_NAME_' => $plugin['name'],
5156
'_MODULE_' => $modulo->getTranslation('title'),
57+
'_COUNT_' => $plugin['count'],
5258
]),
5359
]);
5460
}
61+
62+
// 2. Controllo plugin diversi con stesso title nello stesso modulo e lingua
63+
$duplicati_title_diversi = database()->fetchArray('
64+
SELECT `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`title`, `zz_plugins_lang`.`id_lang`,
65+
COUNT(DISTINCT `zz_plugins_lang`.`id_record`) as `count_plugin`,
66+
GROUP_CONCAT(DISTINCT `zz_plugins`.`name`) as `nomi_plugin`
67+
FROM `zz_plugins_lang`
68+
INNER JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_plugins_lang`.`id_record`
69+
WHERE `zz_plugins_lang`.`title` IS NOT NULL AND `zz_plugins_lang`.`title` != ""
70+
GROUP BY `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`title`, `zz_plugins_lang`.`id_lang`
71+
HAVING COUNT(DISTINCT `zz_plugins_lang`.`id_record`) > 1
72+
');
73+
74+
foreach ($duplicati_title_diversi as $plugin) {
75+
$modulo = Module::find($plugin['idmodule_to']);
76+
$lingua = database()->fetchOne('SELECT `name` FROM `zz_langs` WHERE `id` = '.prepare($plugin['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_diversi_' . $plugin['idmodule_to'] . '_' . $plugin['id_lang'] . '_' . md5($plugin['title']),
83+
'nome' => $modulo->getTranslation('title') . ': ' . $plugin['title'] . ' (' . $nome_lingua . ')',
84+
'descrizione' => tr('Il titolo "_TITLE_" del modulo _MODULE_ è usato da _COUNT_ plugin diversi (_PLUGINS_) nella lingua _LANG_', [
85+
'_TITLE_' => $plugin['title'],
86+
'_MODULE_' => $modulo->getTranslation('title'),
87+
'_COUNT_' => $plugin['count_plugin'],
88+
'_PLUGINS_' => $plugin['nomi_plugin'],
89+
'_LANG_' => $nome_lingua,
90+
]),
91+
]);
92+
}
93+
94+
// 3. Controllo record duplicati in zz_plugins_lang con stesso id_record e id_lang
95+
$duplicati_record_lang = database()->fetchArray('
96+
SELECT `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`id_record`, `zz_plugins_lang`.`id_lang`, COUNT(*) as `count`
97+
FROM `zz_plugins_lang`
98+
INNER JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_plugins_lang`.`id_record`
99+
GROUP BY `zz_plugins_lang`.`id_record`, `zz_plugins_lang`.`id_lang`
100+
HAVING COUNT(*) > 1
101+
');
102+
103+
foreach ($duplicati_record_lang as $plugin) {
104+
$modulo = Module::find($plugin['idmodule_to']);
105+
$lingua = database()->fetchOne('SELECT `name` FROM `zz_langs` WHERE `id` = '.prepare($plugin['id_lang']));
106+
$plugin_record = database()->fetchOne('SELECT `name` FROM `zz_plugins` WHERE `id` = '.prepare($plugin['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_' . $plugin['id_record'] . '_' . $plugin['id_lang'],
113+
'nome' => $modulo->getTranslation('title') . ': ' . $plugin_record['name'] . ' (' . $nome_lingua . ')',
114+
'descrizione' => tr('Il plugin _NAME_ del modulo _MODULE_ ha _COUNT_ traduzioni duplicate per la lingua _LANG_', [
115+
'_NAME_' => $plugin_record['name'],
116+
'_MODULE_' => $modulo->getTranslation('title'),
117+
'_COUNT_' => $plugin['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;
55130
}
56131

57132
public function execute($record, $params = [])
58133
{
59-
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_plugins
149+
$duplicati_name = $database->fetchArray('
150+
SELECT `id`, `idmodule_to`, `name`
151+
FROM `zz_plugins`
152+
WHERE `name` IS NOT NULL AND `name` != ""
153+
AND (`idmodule_to`, `name`) IN (
154+
SELECT `idmodule_to`, `name`
155+
FROM `zz_plugins`
156+
WHERE `name` IS NOT NULL AND `name` != ""
157+
GROUP BY `idmodule_to`, `name`
158+
HAVING COUNT(*) > 1
159+
)
160+
ORDER BY `idmodule_to`, `name`, `id` DESC
161+
');
162+
163+
$grouped_name = [];
164+
foreach ($duplicati_name as $record) {
165+
$key = $record['idmodule_to'] . '_' . $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_plugins` WHERE `id` = ' . prepare($group[$i]['id']));
174+
$results['name_' . $group[$i]['id']] = true;
175+
}
176+
}
177+
}
178+
179+
// 2. Risolvi record duplicati in zz_plugins_lang con stesso id_record e id_lang
180+
$duplicati_record_lang = $database->fetchArray('
181+
SELECT `id`, `id_record`, `id_lang`
182+
FROM `zz_plugins_lang`
183+
WHERE (`id_record`, `id_lang`) IN (
184+
SELECT `id_record`, `id_lang`
185+
FROM `zz_plugins_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_plugins_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+
}
60215
}
61216
}

0 commit comments

Comments
 (0)