Files
ms1inscription-v5/sql/MSIN-4482-fix-pec-actif-import.sql

109 lines
3.7 KiB
SQL

-- 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.