-- MSIN-4482 — Réparer liste inscriptions pour imports hors transaction -- Contexte : données en BD mais liste / « rapport » trop bas -- Liste = p.pec_id = e.pec_id_original AND pec_actif = 1 -- Notes : exécution UNIQUEMENT sur dev préprod ; autres env = Navicat structure + sync_static_db -- -- AVANT : remplacer 1284 par l'eve_id concerné. -- IMPORTANT : ne PAS forcer pec_id_original = pec_id en masse (UNIQUE pec_id_original → 1062). SET @eve := 1284; -- ========== DIAGNOSTIC ========== SELECT COUNT(*) AS n_participants_import FROM resultats_participants WHERE eve_id = @eve AND par_origine = 'import_fichier'; SELECT COUNT(*) AS n_join_ok FROM resultats_epreuves_commandees e, resultats_participants p WHERE e.eve_id = @eve AND p.pec_id = e.pec_id_original AND p.par_origine = 'import_fichier' AND p.rol_id NOT IN (3, 4) AND e.is_cancelled = 0; SELECT COUNT(*) AS n_visibles_liste FROM resultats_epreuves_commandees e, resultats_participants p WHERE e.eve_id = @eve AND p.pec_id = e.pec_id_original AND p.par_origine = 'import_fichier' AND p.rol_id NOT IN (3, 4) AND e.is_cancelled = 0 AND e.pec_actif = 1; -- Accroche technique import (p.pec_id = e.pec_id) avant réparation SELECT COUNT(*) AS n_lie_via_pec_id FROM resultats_epreuves_commandees e INNER JOIN resultats_participants p ON p.eve_id = e.eve_id AND p.pec_id = e.pec_id WHERE e.eve_id = @eve AND p.par_origine = 'import_fichier'; -- ========== FIX A — pec_actif = 1 (AVANT de bouger p.pec_id) ========== UPDATE resultats_epreuves_commandees e INNER JOIN resultats_participants p ON p.eve_id = e.eve_id AND p.pec_id = e.pec_id AND p.par_origine = 'import_fichier' SET e.pec_actif = 1 WHERE e.eve_id = @eve AND e.is_cancelled = 0 AND IFNULL(e.pec_actif, 0) <> 1; UPDATE resultats_epreuves_commandees e SET e.pec_actif = 1 WHERE e.eve_id = @eve AND e.no_panier LIKE CONCAT('I', @eve, 'X%') AND e.is_cancelled = 0 AND IFNULL(e.pec_actif, 0) <> 1; -- ========== FIX B — join sans toucher UNIQUE pec_id_original ========== -- L'import a souvent p.pec_id = e.pec_id alors que la liste veut p.pec_id = e.pec_id_original. -- On aligne le participant sur pec_id_original (valeur déjà unique). UPDATE resultats_participants p INNER JOIN resultats_epreuves_commandees e ON e.eve_id = p.eve_id AND e.pec_id = p.pec_id SET p.pec_id = e.pec_id_original WHERE p.eve_id = @eve AND p.par_origine = 'import_fichier' AND e.pec_id_original > 0 AND p.pec_id <> e.pec_id_original; -- Optionnel / sûr : pec_id_original := pec_id SEULEMENT s'il n'y a PAS de collision UNIQUE UPDATE resultats_epreuves_commandees e INNER JOIN resultats_participants p ON p.eve_id = e.eve_id AND (p.pec_id = e.pec_id OR p.pec_id = e.pec_id_original) AND p.par_origine = 'import_fichier' LEFT JOIN resultats_epreuves_commandees conflict ON conflict.pec_id_original = e.pec_id AND conflict.pec_id <> e.pec_id SET e.pec_id_original = e.pec_id WHERE e.eve_id = @eve AND e.pec_id_original <> e.pec_id AND conflict.pec_id IS NULL; -- Si l'optionnel a bougé pec_id_original, ré-aligner p.pec_id UPDATE resultats_participants p INNER JOIN resultats_epreuves_commandees e ON e.eve_id = p.eve_id AND e.no_panier LIKE CONCAT('I', @eve, 'X%') AND e.no_panier = p.no_panier SET p.pec_id = e.pec_id_original WHERE p.eve_id = @eve AND p.par_origine = 'import_fichier' AND e.pec_id_original > 0 AND p.pec_id <> e.pec_id_original; -- ========== CONTRÔLE ========== SELECT COUNT(*) AS n_visibles_liste_apres FROM resultats_epreuves_commandees e, resultats_participants p WHERE e.eve_id = @eve AND p.pec_id = e.pec_id_original AND p.par_origine = 'import_fichier' AND p.rol_id NOT IN (3, 4) AND e.is_cancelled = 0 AND e.pec_actif = 1; -- Attendu : proche de n_participants_import.