Refactor fxImportResultatsResetPreview to improve SQL query readability and performance by storing the escaped origin in a variable. Add diagnostic SQL query to count visible participants in the list based on active PEC status. Enhance the event panel UI to display database status with refresh functionality. Increment version code.

This commit is contained in:
2026-07-24 17:06:46 -04:00
parent c6477f7757
commit 05ce600e09

View File

@ -1335,9 +1335,11 @@ function fxImportResultatsResetPreview($intEveId) {
return array('state' => 'error', 'message' => 'eve_id manquant');
}
$strOrig = fxImportResultatsDbEsc(MSIN_IMPORT_RESULTATS_ORIGIN);
$sqlPar = "SELECT COUNT(*) AS n FROM resultats_participants"
. " WHERE eve_id = " . $intEveId
. " AND par_origine = '" . fxImportResultatsDbEsc(MSIN_IMPORT_RESULTATS_ORIGIN) . "'";
. " AND par_origine = '" . $strOrig . "'";
$tabPar = $objDatabase->fxGetResults($sqlPar);
$intPar = is_array($tabPar) ? intval($tabPar[1]['n'] ?? 0) : 0;
@ -1346,24 +1348,38 @@ function fxImportResultatsResetPreview($intEveId) {
. " 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)"
. " WHERE e.eve_id = " . $intEveId
. " AND p.par_origine = '" . fxImportResultatsDbEsc(MSIN_IMPORT_RESULTATS_ORIGIN) . "'";
. " AND p.par_origine = '" . $strOrig . "'";
$tabPec = $objDatabase->fxGetResults($sqlPec);
$intPec = is_array($tabPec) ? intval($tabPec[1]['n'] ?? 0) : 0;
$sqlQue = "SELECT COUNT(*) AS n FROM resultats_questions rq"
. " INNER JOIN resultats_participants p ON (rq.par_id = p.par_id_original OR rq.par_id = p.par_id)"
. " WHERE p.eve_id = " . $intEveId
. " AND p.par_origine = '" . fxImportResultatsDbEsc(MSIN_IMPORT_RESULTATS_ORIGIN) . "'";
. " AND p.par_origine = '" . $strOrig . "'";
$tabQue = $objDatabase->fxGetResults($sqlQue);
$intQue = is_array($tabQue) ? intval($tabQue[1]['n'] ?? 0) : 0;
// Diagnostic : ce que la liste inscriptions verrait (même join + pec_actif)
$sqlList = "SELECT COUNT(*) AS n"
. " FROM resultats_epreuves_commandees e, resultats_participants p"
. " WHERE e.eve_id = " . $intEveId
. " AND p.pec_id = e.pec_id_original"
. " AND p.par_origine = '" . $strOrig . "'"
. " AND p.rol_id NOT IN (3, 4)"
. " AND e.is_cancelled = 0 AND e.pec_actif = 1";
$tabList = $objDatabase->fxGetResults($sqlList);
$intList = is_array($tabList) ? intval($tabList[1]['n'] ?? 0) : 0;
return array(
'state' => 'ok',
'eve_id' => $intEveId,
'participants' => $intPar,
'pec' => $intPec,
'questions' => $intQue,
'message' => $intPar . ' participant(s) import, ' . $intPec . ' pec, ' . $intQue . ' réponse(s) questions.',
'list_visible' => $intList,
'message' => 'En BD : ' . $intPar . ' participant(s) import, '
. $intPec . ' pec, ' . $intQue . ' réponse(s) questions'
. ' — dont ' . $intList . ' visible(s) dans la liste (pec_actif=1).',
);
}
@ -1537,10 +1553,31 @@ function fxImportResultatsRenderEventPanel($intEveId) {
<br><span class="text-muted">Reset = efface seulement <code>par_origine=import_fichier</code> sur cet événement (pas les inscriptions payantes).</span>
</p>
<div class="mb-3">
<button type="button" class="btn btn-outline-danger btn-sm" id="ms1_import_reset_data">
<i class="fa fa-trash" aria-hidden="true"></i> Reset données import
</button>
<div class="mb-3" id="ms1_import_db_status_wrap">
<div class="d-flex flex-wrap align-items-center justify-content-between mb-2">
<strong class="small mb-0">Déjà en BD (origine import_fichier)</strong>
<div>
<button type="button" class="btn btn-outline-secondary btn-sm mr-1" id="ms1_import_refresh_status">
<i class="fa fa-refresh" aria-hidden="true"></i> Actualiser
</button>
<button type="button" class="btn btn-outline-danger btn-sm" id="ms1_import_reset_data">
<i class="fa fa-trash" aria-hidden="true"></i> Reset données import
</button>
</div>
</div>
<div class="ct-api-kpi-row" id="ms1_import_db_kpi_row">
<div class="ct-api-kpi" data-kpi="db_par"><div class="ct-api-kpi__label">Participants</div>
<div class="ct-api-kpi__value" id="ms1_import_db_par">…</div></div>
<div class="ct-api-kpi" data-kpi="db_pec"><div class="ct-api-kpi__label">PEC (coquilles)</div>
<div class="ct-api-kpi__value" id="ms1_import_db_pec">…</div></div>
<div class="ct-api-kpi" data-kpi="db_que"><div class="ct-api-kpi__label">Réponses questions</div>
<div class="ct-api-kpi__value" id="ms1_import_db_que">…</div></div>
<div class="ct-api-kpi ct-api-kpi--warn" data-kpi="db_list"><div class="ct-api-kpi__label">Visibles liste*</div>
<div class="ct-api-kpi__value" id="ms1_import_db_list">…</div></div>
</div>
<p class="small text-muted mb-0 mt-1" id="ms1_import_db_hint">
* Visibles liste ≈ join liste inscriptions avec <code>pec_actif=1</code> (diagnostic).
</p>
</div>
<div class="ms1-import__drop" id="ms1_import_drop" tabindex="0" role="button"
@ -1659,6 +1696,9 @@ function fxImportResultatsRenderEventPanel($intEveId) {
gap: 0.65rem;
grid-template-columns: repeat(5, minmax(0, 1fr));
}
#ms1_import_db_kpi_row.ct-api-kpi-row {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
@media (max-width: 992px) {
#ms1-import-resultats .ct-api-kpi-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@ -2133,10 +2173,55 @@ function fxImportResultatsRenderEventPanel($intEveId) {
});
});
function renderDbStatus(res) {
if (!res || res.state !== 'ok') return;
$('#ms1_import_db_par').text(String(res.participants != null ? res.participants : '—'));
$('#ms1_import_db_pec').text(String(res.pec != null ? res.pec : '—'));
$('#ms1_import_db_que').text(String(res.questions != null ? res.questions : '—'));
$('#ms1_import_db_list').text(String(res.list_visible != null ? res.list_visible : '—'));
if (res.message) {
$('#ms1_import_db_hint').text(res.message);
}
}
function refreshDbStatus(blnSilent) {
$.ajax({
url: ajaxUrl,
method: 'POST',
dataType: 'text',
data: { a: 'reset_preview', eve_id: eveId }
}).done(function (raw) {
var res = parseAjaxJson(raw);
if (!res || res.state !== 'ok') {
if (!blnSilent) {
showStatus('danger', (res && res.message) ? res.message : 'Échec lecture statut BD');
}
$('#ms1_import_db_par, #ms1_import_db_pec, #ms1_import_db_que, #ms1_import_db_list').text('?');
return;
}
renderDbStatus(res);
if (!blnSilent) {
showStatus('info', res.message || 'Statut BD à jour.');
}
}).fail(function () {
$('#ms1_import_db_par, #ms1_import_db_pec, #ms1_import_db_que, #ms1_import_db_list').text('?');
if (!blnSilent) {
showStatus('danger', 'Erreur réseau (statut BD).');
}
});
}
// Statut chargé dès l'ouverture du panneau
refreshDbStatus(true);
$('#ms1_import_refresh_status').on('click', function () {
refreshDbStatus(false);
});
$('#ms1_import_reset_data').on('click', function () {
var $btn = $(this);
$btn.prop('disabled', true);
showStatus('info', 'Comptage des données import…');
showStatus('info', 'Comptage des données import en BD…');
$.ajax({
url: ajaxUrl,
method: 'POST',
@ -2149,17 +2234,22 @@ function fxImportResultatsRenderEventPanel($intEveId) {
showStatus('danger', (prev && prev.message) ? prev.message : 'Échec prévisualisation reset');
return;
}
renderDbStatus(prev);
showStatus('warning', prev.message || '');
if (parseInt(prev.participants, 10) < 1) {
showStatus('info', prev.message || 'Rien à effacer.');
showStatus('info', 'Rien à effacer — 0 participant import en BD.');
return;
}
var strMsg = 'Effacer les données IMPORT de cet événement ?\n\n'
+ (prev.message || '') + '\n\n'
+ 'Participants : ' + prev.participants + '\n'
+ 'PEC (coquilles) : ' + prev.pec + '\n'
+ 'Réponses questions : ' + prev.questions + '\n'
+ 'Visibles liste (pec_actif=1) : ' + (prev.list_visible != null ? prev.list_visible : '?') + '\n\n'
+ 'Les inscriptions en ligne (hors import) ne seront PAS touchées.\n\n'
+ 'Pour confirmer, tapez RESET :';
var strConfirm = window.prompt(strMsg, '');
if (strConfirm === null) {
showStatus('info', 'Reset annulé.');
showStatus('info', 'Reset annulé. Statut BD toujours affiché ci-dessus.');
return;
}
$btn.prop('disabled', true);
@ -2179,6 +2269,7 @@ function fxImportResultatsRenderEventPanel($intEveId) {
showStatus('success', res.message || 'Reset OK');
$('#ms1_import_kpi_row').attr('hidden', true);
$('#ms1_import_exclus_shell').attr('hidden', true);
refreshDbStatus(true);
}).fail(function () {
$btn.prop('disabled', false);
showStatus('danger', 'Erreur réseau (reset).');
@ -2217,6 +2308,7 @@ function fxImportResultatsRenderEventPanel($intEveId) {
}
showStatus((res.blocked_count > 0) ? 'warning' : 'success', res.message || 'Import terminé.');
renderImportBlockedPanel(res);
refreshDbStatus(true);
ensurePanelOpen();
}).fail(function (xhr) {
$btn.prop('disabled', false);
@ -2224,6 +2316,7 @@ function fxImportResultatsRenderEventPanel($intEveId) {
if (res && res.state === 'ok') {
showStatus((res.blocked_count > 0) ? 'warning' : 'success', res.message || 'Import terminé.');
renderImportBlockedPanel(res);
refreshDbStatus(true);
return;
}
showStatus('danger', 'Erreur réseau (import). Timeout possible sur très gros fichiers — réessayez ou coupez le fichier.');