35 Commits

Author SHA1 Message Date
2ee8ee21d2 Fix: Added array checks for $rows in fxGetRangesForBatchAssign and fxLoadUsedBibsForBatch functions to prevent potential errors. 2026-06-03 14:14:56 -04:00
162052a2d1 MSIN-4379 — prêt prod 2026-06-02 15:24:55 -04:00
dabb797060 MSIN-4379 2026-06-02 15:04:03 -04:00
54d5363f09 MSIN-3821 2026-06-02 12:06:16 -04:00
85e030b93a MSIN-3821 2026-06-02 12:05:09 -04:00
1af97e7bb6 test 2026-06-02 12:01:05 -04:00
49d8bd23f4 Merge branch 'dev' of http://git.progiweb.ca/stephan/ms1inscription-v5 into dev 2026-06-02 11:59:57 -04:00
2f699ed10d MSIN-3821 ajout de v2 pour les admin 2026-06-02 11:59:53 -04:00
a30f887489 Merge remote-tracking branch 'gitea/dev' into dev 2026-06-01 11:32:47 -04:00
bdf5df0923 MSIN-4378 2026-06-01 11:32:27 -04:00
79bea0f9c7 test 2026-06-01 10:15:28 -04:00
088cfefee2 ms1.ca 2026-05-28 15:33:51 -04:00
1baefb5f9c code qr vehicule 2026-05-28 11:58:05 -04:00
504f245eb5 code qr vehicule 2026-05-28 11:55:39 -04:00
088fd91617 code qr vehicule 2026-05-28 11:52:30 -04:00
238c09357e code qr vehicule 2026-05-28 11:49:40 -04:00
c2b5b68568 test 2026-05-28 11:43:12 -04:00
789ce4947d code qr vehicule 2026-05-28 11:31:57 -04:00
ef8304c617 code qr vehicule 2026-05-28 11:26:29 -04:00
3ed9f8e1fc code qr vehicule 2026-05-28 11:18:58 -04:00
d9775ab315 MSIN-4378 2026-05-27 11:10:20 -04:00
8717130865 MSIN-4378 2026-05-27 11:09:49 -04:00
044aca6026 MSIN-4378 2026-05-27 11:09:01 -04:00
97e554fc20 MSIN-4378 2026-05-27 11:06:49 -04:00
b5ca510f1f MSIN-4378 2026-05-27 11:05:15 -04:00
4d7ebeba85 MSIN-4378 2026-05-27 11:02:20 -04:00
382b83e690 MSIN-4378 2026-05-27 10:59:27 -04:00
d016eacb57 MSIN-4378 2026-05-27 10:56:35 -04:00
8001389e39 MSIN-4378 2026-05-27 10:52:55 -04:00
0a944bd549 MSIN-4378 2026-05-27 10:52:22 -04:00
804a8bba18 MSIN-4378 2026-05-27 10:50:38 -04:00
f6398c5035 MSIN-4378 2026-05-27 10:49:07 -04:00
025e145f6f Merge branch 'dev' of http://git.progiweb.ca/stephan/ms1inscription-v5 into dev 2026-05-27 10:48:18 -04:00
d006d75e53 ajout switch qrcode MSIN-4376 2026-05-27 10:46:01 -04:00
f83bc634a3 Clic sur un œil MSIN-4370 2026-05-27 10:08:44 -04:00
9 changed files with 1248 additions and 28 deletions

View File

@ -605,6 +605,45 @@ if ($action == 'save_team_mode') {
exit;
}
// MSIN-4379 — Étape 2
// Endpoint AJAX : sauvegarde ou désactivation de la config auto (epr_bib_auto).
// Paramètres : epr_id, active (0|1), ranges (JSON des epr_bib_id).
// Prochain tour : étape 67 (assignation réelle à l'achat, sans passer par cet endpoint).
if ($action == 'save_auto_config') {
$epr_id = intval($_POST['epr_id'] ?? 0);
$active = intval($_POST['active'] ?? 1) === 1;
$ranges = json_decode($_POST['ranges'] ?? '[]', true);
if ($epr_id <= 0) {
echo json_encode([
'success' => false,
'message' => 'epr_id invalide'
]);
exit;
}
$result = fxSaveBibAutoConfig($epr_id, is_array($ranges) ? $ranges : [], $active);
if (!$result['success']) {
echo json_encode([
'success' => false,
'message' => $result['message'] ?? 'Erreur'
]);
exit;
}
$tabBibStats = fxInfosBibRange($epr_id);
echo json_encode([
'success' => true,
'auto_active' => !empty($result['auto_active']),
'html' => renderBibRanges($tabBibStats, $epr_id, 'assign')
]);
exit;
}
// =====================
// ACTION INVALIDE
// =====================

View File

@ -713,9 +713,8 @@ require_once("inc_header.php");
break;
case 'compte_inc_tableau_dossards':
$blnBoutonRetour = false;
// include("inc_tableau_dossards.php");
// assigmation v2 MSIN-3821
include("inc_tableau_dossards_v2.php");
include("inc_tableau_dossards.php");
break;
case 'compte_inc_tableau_epreuves':
$blnBoutonRetour = false;

View File

@ -1101,6 +1101,30 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
display:none;
}
/* MSIN-4379 — Étape 2 : styles du mode « auto » (masque batch, verrouille édition des plages).
Prochain tour : étape 67 (logique PHP à l'achat, pas de CSS supplémentaire prévu). */
.epr-row.auto-mode .btn-assign-batch,
.epr-row.auto-mode .btn-reset,
.epr-row.auto-mode .batch-config-container {
display: none;
}
.epr-row.auto-mode .btn-auto {
display: none;
}
.epr-row.auto-mode .btn-save-range,
.epr-row.auto-mode .btn-delete-range,
.epr-row.auto-mode .btn-add-range {
visibility: hidden;
}
.epr-row.auto-mode .bib-start,
.epr-row.auto-mode .bib-end {
pointer-events: none;
background: #eee;
}
.epr-row.batch-mode .btn-go-batch {
display: none;
}

View File

@ -1948,6 +1948,189 @@ if ($strLangue == 'fr') {
if (moduleBib) {
// ============================================================
// MSIN-4379 — Étape 2 : assignation automatique (interface JS)
// Prochain tour : étape 6 (fxAssignAutoBibForParticipant), étape 7 (fxMajCommande).
// ============================================================
/** MSIN-4379 — Compte les séquences cochées et met à jour le texte d'aide. */
function updateAutoSelectionInfo(row) {
if (!row) return;
let count = row.querySelectorAll('.batch-select-range:checked').length;
let info = row.querySelector('.auto-info');
if (!info) return;
if (count === 0) {
info.textContent = 'Sélectionnez au moins une séquence.';
} else {
info.textContent = count + ' séquence(s) sélectionnée(s).';
}
}
/** MSIN-4379 — Après sauvegarde : badge, libellé du bouton, bouton Désactiver. */
function syncAutoUiState(row, isActive) {
if (!row) return;
let btnAuto = row.querySelector('.btn-auto');
let badge = row.querySelector('.bib-auto-badge');
let btnDesactiver = row.querySelector('.btn-desactiver-auto');
row.dataset.autoActive = isActive ? '1' : '0';
if (isActive) {
row.classList.add('auto-enabled');
} else {
row.classList.remove('auto-enabled');
}
if (btnAuto) {
btnAuto.textContent = isActive ? 'Configurer automatique' : 'Activer automatique';
btnAuto.classList.toggle('btn-success', isActive);
btnAuto.classList.toggle('btn-secondary', !isActive);
}
if (badge) {
badge.style.display = isActive ? '' : 'none';
}
if (btnDesactiver) {
btnDesactiver.style.display = isActive ? '' : 'none';
}
}
/** MSIN-4379 — Quitte le mode édition auto sans sauver ; recharge les plages (mode assign). */
function exitAutoMode(row) {
if (!row) return;
row.classList.remove('auto-mode');
let container = row.querySelector('.bib-container');
if (container) {
container.classList.remove('batch-mode');
}
row.querySelectorAll('.bib-start, .bib-end').forEach(input => {
input.removeAttribute('readonly');
});
let autoConfig = row.querySelector('.auto-config-container');
if (autoConfig) {
autoConfig.style.display = 'none';
}
let btnAuto = row.querySelector('.btn-auto');
if (btnAuto) {
btnAuto.style.display = '';
}
let btnBatch = row.querySelector('.btn-assign-batch');
if (btnBatch) {
btnBatch.style.display = '';
}
let btnReset = row.querySelector('.btn-reset');
if (btnReset) {
btnReset.style.display = '';
}
fetch('/ajax_bib_range.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body:
'action=refresh_ranges'
+ '&epr_id=' + encodeURIComponent(row.dataset.eprId)
+ '&mode=assign'
})
.then(res => res.json())
.then(data => {
if (!data.success) return;
let bibContainer = row.querySelector('.epr-block:nth-child(2) .bib-container');
if (bibContainer) {
bibContainer.innerHTML = data.html;
}
syncBibUiState(row);
});
}
/** MSIN-4379 — Ouvre le mode édition : checkboxes, bloc Accepter/Annuler, refresh mode=auto. */
function enterAutoMode(row) {
if (!row) return;
if (row.classList.contains('batch-mode') || row.classList.contains('reset-mode')) {
return;
}
row.classList.add('auto-mode');
let container = row.querySelector('.bib-container');
if (container) {
container.classList.add('batch-mode');
}
row.querySelectorAll('.bib-start, .bib-end').forEach(input => {
input.setAttribute('readonly', true);
});
let autoConfig = row.querySelector('.auto-config-container');
if (autoConfig) {
autoConfig.style.display = 'block';
}
let btnAuto = row.querySelector('.btn-auto');
if (btnAuto) {
btnAuto.style.display = 'none';
}
let btnBatch = row.querySelector('.btn-assign-batch');
if (btnBatch) {
btnBatch.style.display = 'none';
}
let btnReset = row.querySelector('.btn-reset');
if (btnReset) {
btnReset.style.display = 'none';
}
fetch('/ajax_bib_range.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body:
'action=refresh_ranges'
+ '&epr_id=' + encodeURIComponent(row.dataset.eprId)
+ '&mode=auto'
})
.then(res => res.json())
.then(data => {
if (!data.success) return;
let bibContainer = row.querySelector('.epr-block:nth-child(2) .bib-container');
if (!bibContainer) return;
bibContainer.innerHTML = data.html;
bibContainer.classList.add('batch-mode');
row.querySelectorAll('.bib-start, .bib-end').forEach(input => {
input.setAttribute('readonly', true);
});
updateAutoSelectionInfo(row);
});
}
function syncBibUiState(row) {
let avecEl = row.querySelector('.bib-avec');
@ -2113,6 +2296,12 @@ if ($strLangue == 'fr') {
let row = cb.closest('.epr-row');
if (!row) return;
// MSIN-4379 — En mode auto, pas de logique batch (refresh_ranges / GO).
if (row.classList.contains('auto-mode')) {
updateAutoSelectionInfo(row);
return;
}
if (row.dataset.loading === '1') return;
let existing = document.querySelector('.epr-row-view');
if (existing) existing.remove();
@ -2337,6 +2526,23 @@ if ($strLangue == 'fr') {
let container = btnView.closest('.epr-block');
// Vérifier si une vue est déjà ouverte
let existing = document.querySelector('.epr-row-view');
// Toggle : si c'est le même œil qui a ouvert la vue, on la ferme et on s'arrête
if (existing
&& existing.dataset.eprId === epr_id
&& existing.dataset.rangeId === range_id
) {
existing.remove();
return;
}
// Un autre œil a été cliqué : fermer la vue précédente avant d'ouvrir la nouvelle
if (existing) {
existing.remove();
}
fetch('/ajax_bib_range.php', {
method: 'POST',
headers: {
@ -2365,14 +2571,17 @@ if ($strLangue == 'fr') {
let row = btnView.closest('.epr-row');
// 1. Supprimer toute vue existante
let existing = document.querySelector('.epr-row-view');
if (existing) {
existing.remove();
}
// 2. Injecter sous la bonne ligne
// Injecter la nouvelle vue sous la ligne du bouton cliqué,
// en mémorisant epr_id et range_id pour le toggle suivant
row.insertAdjacentHTML('afterend', data.html);
// Stocker les identifiants sur la vue injectée pour pouvoir détecter
// le 2e clic sur le même œil
let newView = row.nextElementSibling;
if (newView && newView.classList.contains('epr-row-view')) {
newView.dataset.eprId = epr_id;
newView.dataset.rangeId = range_id;
}
});
return;
@ -2410,6 +2619,11 @@ if ($strLangue == 'fr') {
let row = btnBatch.closest('.epr-row');
if (!row) return;
// MSIN-4379 — Batch et auto sont mutuellement exclusifs.
if (row.classList.contains('auto-mode')) {
return;
}
let container = row.querySelector('.bib-container');
if (!container) return;
@ -2534,6 +2748,11 @@ if ($strLangue == 'fr') {
let row = btnReset.closest('.epr-row');
if (!row) return;
// MSIN-4379 — Reset et auto sont mutuellement exclusifs.
if (row.classList.contains('auto-mode')) {
return;
}
let container = row.querySelector('.bib-container');
if (!container) return;
@ -2835,6 +3054,125 @@ if ($strLangue == 'fr') {
return;
}
// =====================
// MSIN-4379 — Étape 2 : AUTO DOSSARD (clics Accepter / Annuler / Désactiver / Activer)
// Prochain tour : étape 67 (assignation PHP à l'inscription).
// =====================
let btnAccepterAuto = e.target.closest('.btn-accepter-auto');
if (btnAccepterAuto) {
e.preventDefault();
let row = btnAccepterAuto.closest('.epr-row');
if (!row) return;
let selected = [];
row.querySelectorAll('.batch-select-range:checked').forEach(cb => {
selected.push(cb.dataset.rangeId);
});
if (selected.length === 0) {
alert('Sélectionnez au moins une séquence');
return;
}
// MSIN-4379 — Persiste epr_bib_auto=1 sur les séquences choisies (save_auto_config).
fetch('/ajax_bib_range.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body:
'action=save_auto_config'
+ '&epr_id=' + encodeURIComponent(row.dataset.eprId)
+ '&active=1'
+ '&ranges=' + encodeURIComponent(JSON.stringify(selected))
})
.then(res => res.json())
.then(data => {
if (!data.success) {
alert(data.message || 'Erreur');
return;
}
syncAutoUiState(row, true);
exitAutoMode(row);
});
return;
}
// MSIN-4379 — Annule l'édition sans appeler save_auto_config.
let btnAnnulerAuto = e.target.closest('.btn-annuler-auto');
if (btnAnnulerAuto) {
e.preventDefault();
let row = btnAnnulerAuto.closest('.epr-row');
if (!row) return;
exitAutoMode(row);
return;
}
// MSIN-4379 — Désactive l'auto en base (active=0, toutes les séquences à 0).
let btnDesactiverAuto = e.target.closest('.btn-desactiver-auto');
if (btnDesactiverAuto) {
e.preventDefault();
let row = btnDesactiverAuto.closest('.epr-row');
if (!row) return;
if (!confirm('Désactiver l\'assignation automatique pour cette épreuve ?')) {
return;
}
fetch('/ajax_bib_range.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body:
'action=save_auto_config'
+ '&epr_id=' + encodeURIComponent(row.dataset.eprId)
+ '&active=0'
+ '&ranges=' + encodeURIComponent('[]')
})
.then(res => res.json())
.then(data => {
if (!data.success) {
alert(data.message || 'Erreur');
return;
}
syncAutoUiState(row, false);
exitAutoMode(row);
});
return;
}
// MSIN-4379 — Entrée dans le mode configuration auto.
let btnAuto = e.target.closest('.btn-auto');
if (btnAuto) {
e.preventDefault();
let row = btnAuto.closest('.epr-row');
if (!row) return;
if (row.classList.contains('batch-mode') || row.classList.contains('reset-mode')) {
return;
}
enterAutoMode(row);
return;
}
// =====================
// CREATE
// =====================

View File

@ -65,9 +65,14 @@ if ($intEveId != 0) {
<a class="nav-list" href="<?php echo $vDomaine . "/" . $strCode; ?>bib_assignment?a=show_bib_dupes&promoteur_eve_id=<?php echo urlencode(base64_encode($intEveId)); ?>"> <i class="fa fa-clone" aria-hidden="true"></i> <?php echo afficheTexte('tableau_dossards_doublons', 0) ;?>
</a>
</li> </ul>
<?php
if (isset($_SESSION['usa_id'])) {
fxShowBibTool4($strBibCode, $intEveId, $strLangue);
}
fxShowBibTool3($strBibCode, $intEveId, $strLangue);
?>
<a class="btn btn-primary rounded-pill" id="link_back" href="<?php echo $vDomaine . $strPage . "/inc_tableau_promoteur?promoteur_eve_id=" . urlencode(base64_encode($intEveId)); ?>">

682
ms1_kc_set.php Normal file
View File

@ -0,0 +1,682 @@
<?php
/**
* Outil temporaire : modifier key_chain_http pour un pk_key_chain.
* Accès 1 : /ms1_kc_set.php?k=<KEYCHAIN_HTTP_EDIT_SECRET>
* Accès 2 : compte connecté dont com_id est dans KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS
*/
$blnNoMaintenance = true;
session_start();
require_once __DIR__ . '/php/inc_fonctions.php';
header('X-Robots-Tag: noindex, nofollow');
header('Cache-Control: no-store, no-cache, must-revalidate');
global $objDatabase, $vDomaine;
function kc_set_allowed_com_ids()
{
if (!defined('KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS') || KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS === '') {
return [];
}
$arr = array_map('intval', explode(',', KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS));
return array_values(array_filter($arr, function ($id) {
return $id > 0;
}));
}
function kc_set_com_id_authorized()
{
if (!isset($_SESSION['com_id']) || (int) $_SESSION['com_id'] <= 0) {
return false;
}
return in_array((int) $_SESSION['com_id'], kc_set_allowed_com_ids(), true);
}
$strSecret = isset($_GET['k']) ? (string) $_GET['k'] : '';
$blnAuthSecret = ($strSecret !== '' && hash_equals(KEYCHAIN_HTTP_EDIT_SECRET, $strSecret));
if ($blnAuthSecret) {
$_SESSION['kc_edit_auth_key'] = 1;
}
$blnAuthUser = kc_set_com_id_authorized();
$blnAuth = $blnAuthSecret || $blnAuthUser || !empty($_SESSION['kc_edit_auth_key']);
if (!$blnAuth) {
if (!isset($_SESSION['com_id']) && kc_set_allowed_com_ids() !== []) {
$_SESSION['redirect_after_login'] = $_SERVER['REQUEST_URI'];
header('Location: ' . $vDomaine . '/compte');
exit;
}
http_response_code(403);
echo '<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><title>Accès refusé</title></head><body>';
echo '<p>Accès refusé.</p>';
if (kc_set_allowed_com_ids() !== []) {
echo '<p><a href="' . htmlspecialchars($vDomaine . '/compte', ENT_QUOTES, 'UTF-8') . '">Se connecter</a></p>';
}
echo '</body></html>';
exit;
}
if (empty($_SESSION['kc_edit_csrf'])) {
$_SESSION['kc_edit_csrf'] = bin2hex(random_bytes(16));
}
$strCsrf = $_SESSION['kc_edit_csrf'];
$strBasePath = $_SERVER['PHP_SELF'];
function kc_set_page_url(array $params = [])
{
global $strBasePath;
$query = $params;
if (!empty($_SESSION['kc_edit_auth_key']) && !isset($query['k'])) {
$query = array_merge(['k' => KEYCHAIN_HTTP_EDIT_SECRET], $query);
}
$qs = http_build_query($query);
return $strBasePath . ($qs !== '' ? '?' . $qs : '');
}
$strPageUrl = kc_set_page_url();
$strBaseUrlHtml = htmlspecialchars($strPageUrl, ENT_QUOTES, 'UTF-8');
$blnCanShareLink = !empty($_SESSION['kc_edit_auth_key']);
$strShareUrl = '';
if ($blnCanShareLink) {
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$strShareUrl = $scheme . '://' . $_SERVER['HTTP_HOST'] . kc_set_page_url(['k' => KEYCHAIN_HTTP_EDIT_SECRET]);
}
$strUserName = '';
if ($blnAuthUser && !empty($_SESSION['com_prenom'])) {
$strUserName = trim((string) $_SESSION['com_prenom']);
} elseif ($blnAuthUser && !empty($_SESSION['com_info']['com_prenom'])) {
$strUserName = trim((string) $_SESSION['com_info']['com_prenom']);
}
$strMessage = '';
$strMessageClass = '';
$intPk = 0;
$strCurrentHttp = '';
$blnShowUrlForm = false;
$strVehiculeSaisi = '';
if (!empty($_GET['ok'])) {
$strMessage = 'Le lien de votre code QR a été enregistré. Vous pouvez modifier un autre véhicule ci-dessous.';
$strMessageClass = 'ok';
}
function kc_set_parse_vehicule_no($input)
{
$input = trim((string) $input);
if ($input === '' || !ctype_digit($input)) {
return 0;
}
$no = intval($input);
if ($no <= 0) {
return 0;
}
return $no + KEYCHAIN_HTTP_EDIT_SHIFT;
}
function kc_set_validate_url($url)
{
$url = trim($url);
if ($url === '') {
return false;
}
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return false;
}
$parts = parse_url($url);
if (empty($parts['scheme']) || !in_array(strtolower($parts['scheme']), ['http', 'https'], true)) {
return false;
}
return $url;
}
function kc_set_save_lien_for_pk($intPk, $strVehiculeSaisi, $strNewHttp)
{
global $objDatabase, $strMessage, $strMessageClass, $strCurrentHttp, $blnShowUrlForm;
if ($strVehiculeSaisi !== '' && kc_set_parse_vehicule_no($strVehiculeSaisi) !== $intPk) {
$intPk = 0;
}
if ($intPk <= 0) {
$strMessage = 'Veuillez recommencer avec votre numéro de véhicule.';
$strMessageClass = 'err';
return false;
}
$sqlCheck = 'SELECT pk_key_chain FROM key_chain WHERE pk_key_chain = ' . $intPk;
if ($objDatabase->fxGetRow($sqlCheck) === null) {
$strMessage = 'Code QR introuvable. Vérifiez votre numéro de véhicule.';
$strMessageClass = 'err';
return false;
}
$sqlUpdate = "UPDATE key_chain SET key_chain_http = '" . $objDatabase->fxEscape($strNewHttp) . "' WHERE pk_key_chain = " . $intPk;
if ($objDatabase->fxQuery($sqlUpdate) === false) {
$strMessage = 'Impossible denregistrer pour le moment. Réessayez plus tard.';
$strMessageClass = 'err';
$blnShowUrlForm = true;
$strCurrentHttp = $strNewHttp;
return false;
}
header('Location: ' . kc_set_page_url(['ok' => '1']));
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$strPostedCsrf = isset($_POST['csrf']) ? (string) $_POST['csrf'] : '';
if (!hash_equals($strCsrf, $strPostedCsrf)) {
$strMessage = 'Veuillez recharger la page et réessayer.';
$strMessageClass = 'err';
} else {
$strAction = isset($_POST['action']) ? (string) $_POST['action'] : '';
if ($strAction === 'load') {
$strVehiculeSaisi = isset($_POST['vehicule_no']) ? trim((string) $_POST['vehicule_no']) : '';
$intPk = kc_set_parse_vehicule_no($strVehiculeSaisi);
if ($intPk <= 0) {
$strMessage = 'Veuillez entrer un numéro de véhicule valide.';
$strMessageClass = 'err';
} else {
$sql = 'SELECT key_chain_http FROM key_chain WHERE pk_key_chain = ' . $intPk;
$row = $objDatabase->fxGetRow($sql);
if ($row === null || !isset($row['key_chain_http'])) {
$strMessage = 'Aucun code QR trouvé pour ce numéro de véhicule.';
$strMessageClass = 'err';
} else {
$strCurrentHttp = $row['key_chain_http'];
$blnShowUrlForm = true;
}
}
} elseif ($strAction === 'save') {
$intPk = intval(isset($_POST['pk']) ? $_POST['pk'] : 0);
$strVehiculeSaisi = isset($_POST['vehicule_no']) ? trim((string) $_POST['vehicule_no']) : '';
$strLienPost = isset($_POST['lien_qr']) ? trim((string) $_POST['lien_qr']) : '';
$strNewHttp = kc_set_validate_url($strLienPost);
if ($strNewHttp === false) {
$strMessage = 'Veuillez entrer une adresse Web valide (commençant par http:// ou https://).';
$strMessageClass = 'err';
$blnShowUrlForm = true;
$strCurrentHttp = $strLienPost;
} else {
kc_set_save_lien_for_pk($intPk, $strVehiculeSaisi, $strNewHttp);
}
} elseif ($strAction === 'save_ms1') {
$intPk = intval(isset($_POST['pk']) ? $_POST['pk'] : 0);
$strVehiculeSaisi = isset($_POST['vehicule_no']) ? trim((string) $_POST['vehicule_no']) : '';
kc_set_save_lien_for_pk($intPk, $strVehiculeSaisi, 'https://ms1.ca');
}
}
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex, nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Code QR — lien de redirection</title>
<style>
:root {
--ms1-orange: #ff8c00;
--ms1-orange-dark: #e67a00;
--ms1-ink: #1a1a2e;
--ms1-card: #ffffff;
--ms1-muted: #5c6370;
--ms1-ok: #0d7a4a;
--ms1-err: #b42318;
--radius: 16px;
--shadow: 0 12px 40px rgba(26, 26, 46, 0.12);
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
color: var(--ms1-ink);
background:
radial-gradient(ellipse 80% 50% at 50% -10%, rgba(255, 140, 0, 0.25), transparent),
linear-gradient(160deg, #f8f4ef 0%, #eef2f7 45%, #e8edf5 100%);
padding: 1.5rem 1rem 3rem;
}
.page {
max-width: 640px;
margin: 0 auto;
animation: fadeUp 0.5s ease-out;
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.hero {
text-align: center;
margin-bottom: 1.5rem;
}
.qr-icon {
width: 56px;
height: 56px;
margin: 0 auto 0.75rem;
background: var(--ms1-ink);
border-radius: 12px;
padding: 10px;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
box-shadow: 0 6px 20px rgba(26, 26, 46, 0.2);
}
.qr-icon span {
background: var(--ms1-orange);
border-radius: 2px;
}
.qr-icon span:nth-child(5) { background: #fff; }
h1 {
margin: 0;
font-size: 1.75rem;
font-weight: 700;
letter-spacing: -0.02em;
}
.user-bar {
margin-top: 0.5rem;
color: var(--ms1-muted);
font-size: 1rem;
}
.intro {
text-align: center;
font-size: 1.08rem;
line-height: 1.6;
color: var(--ms1-muted);
margin: 0 0 1.5rem;
padding: 0 0.5rem;
}
.steps {
display: flex;
justify-content: center;
gap: 0.5rem;
margin-bottom: 1.25rem;
}
.step {
width: 2.5rem;
height: 2.5rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 0.95rem;
background: #dde3eb;
color: var(--ms1-muted);
transition: transform 0.2s, background 0.2s;
}
.step.active {
background: var(--ms1-orange);
color: #fff;
transform: scale(1.08);
box-shadow: 0 4px 14px rgba(255, 140, 0, 0.45);
}
.step.done {
background: var(--ms1-ok);
color: #fff;
}
.step-line {
width: 2rem;
height: 3px;
align-self: center;
background: #dde3eb;
border-radius: 2px;
}
.card {
background: var(--ms1-card);
border-radius: var(--radius);
box-shadow: var(--shadow);
padding: 1.75rem 1.5rem 1.5rem;
border: 1px solid rgba(255, 255, 255, 0.8);
}
.field-label {
display: block;
font-weight: 700;
font-size: 1.05rem;
margin-bottom: 0.6rem;
color: var(--ms1-ink);
}
.field-wrap {
position: relative;
margin-bottom: 0.25rem;
}
.input-vehicule {
width: 100%;
padding: 1rem 1.15rem;
font-size: 1.75rem;
font-weight: 700;
text-align: center;
letter-spacing: 0.08em;
border: 2px solid #e2e8f0;
border-radius: 12px;
transition: border-color 0.2s, box-shadow 0.2s;
}
.input-vehicule:focus {
outline: none;
border-color: var(--ms1-orange);
box-shadow: 0 0 0 4px rgba(255, 140, 0, 0.2);
}
.input-lien {
width: 100%;
padding: 1rem 1.15rem;
font-size: 1.05rem;
line-height: 1.45;
border: 2px solid #e2e8f0;
border-radius: 12px;
transition: border-color 0.2s, box-shadow 0.2s;
}
.input-lien:focus {
outline: none;
border-color: var(--ms1-orange);
box-shadow: 0 0 0 4px rgba(255, 140, 0, 0.2);
}
.input-lien::placeholder {
color: #9aa3af;
font-family: inherit;
}
.actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.75rem 1rem;
margin-top: 1.25rem;
}
.btn-enter {
display: inline-flex;
align-items: center;
gap: 0.55rem;
padding: 0.85rem 1.5rem;
font-size: 1.05rem;
font-weight: 700;
color: #fff;
background: linear-gradient(180deg, var(--ms1-orange) 0%, var(--ms1-orange-dark) 100%);
border: none;
border-radius: 999px;
cursor: pointer;
box-shadow: 0 6px 20px rgba(255, 140, 0, 0.4);
transition: transform 0.15s, box-shadow 0.15s;
}
.btn-enter:hover {
transform: translateY(-2px);
box-shadow: 0 10px 28px rgba(255, 140, 0, 0.5);
}
.btn-enter:active {
transform: translateY(0);
}
.btn-ms1 {
display: inline-flex;
align-items: center;
padding: 0.85rem 1.25rem;
font-size: 1rem;
font-weight: 700;
color: var(--ms1-ink);
background: #fff;
border: 2px solid var(--ms1-ink);
border-radius: 999px;
cursor: pointer;
transition: background 0.15s, color 0.15s;
}
.btn-ms1:hover {
background: var(--ms1-ink);
color: #fff;
}
.btn-enter:disabled {
opacity: 0.85;
cursor: wait;
transform: none;
}
.btn-enter .key-cap {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2rem;
height: 1.75rem;
padding: 0 0.4rem;
background: rgba(255, 255, 255, 0.25);
border-radius: 6px;
font-size: 0.9rem;
border: 1px solid rgba(255, 255, 255, 0.35);
}
.hint {
color: var(--ms1-muted);
font-size: 0.9rem;
margin: 0;
}
.msg {
margin: 0 0 1.25rem;
padding: 1rem 1.15rem;
border-radius: 12px;
font-size: 1rem;
font-weight: 500;
animation: fadeUp 0.35s ease-out;
}
.msg.ok {
background: #e6f4ed;
color: var(--ms1-ok);
border: 1px solid #b8e6d0;
}
.msg.err {
background: #fdecea;
color: var(--ms1-err);
border: 1px solid #f5c4c0;
}
.back {
text-align: center;
margin-top: 1.5rem;
}
.back a {
color: var(--ms1-muted);
text-decoration: none;
font-weight: 600;
padding: 0.5rem 1rem;
border-radius: 8px;
transition: color 0.2s, background 0.2s;
}
.back a:hover {
color: var(--ms1-orange-dark);
background: rgba(255, 140, 0, 0.1);
}
.share-box {
background: #fff8ee;
border: 1px dashed var(--ms1-orange);
border-radius: 12px;
padding: 1rem 1.15rem;
margin-bottom: 1.25rem;
}
.share-box strong {
display: block;
margin-bottom: 0.5rem;
font-size: 0.95rem;
}
.share-row {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.share-url {
flex: 1 1 12rem;
min-width: 0;
padding: 0.55rem 0.65rem;
font-size: 0.82rem;
border: 1px solid #e2e8f0;
border-radius: 8px;
background: #fff;
}
.btn-copy {
padding: 0.55rem 1rem;
font-weight: 600;
font-size: 0.9rem;
border: none;
border-radius: 8px;
background: var(--ms1-ink);
color: #fff;
cursor: pointer;
}
.btn-copy:hover { background: #2d2d44; }
@media (max-width: 480px) {
.actions { flex-direction: column; align-items: stretch; }
.btn-enter { justify-content: center; }
}
</style>
</head>
<body>
<div class="page">
<header class="hero">
<div class="qr-icon" aria-hidden="true">
<span></span><span></span><span></span>
<span></span><span></span><span></span>
<span></span><span></span><span></span>
</div>
<h1>Code QR</h1>
<?php if ($strUserName !== '') { ?>
<p class="user-bar">Bonjour <?php echo htmlspecialchars($strUserName, ENT_QUOTES, 'UTF-8'); ?>.</p>
<?php } ?>
</header>
<p class="intro">Entrez votre numéro de véhicule. Vous pourrez ainsi changer le lien de votre code QR.</p>
<?php if ($blnCanShareLink && $strShareUrl !== '') { ?>
<div class="share-box">
<strong>Lien à envoyer aux autres</strong>
<p class="hint" style="margin:0 0 0.65rem;">Chaque personne ouvre ce lien et entre <em>son</em> numéro de véhicule.</p>
<div class="share-row">
<input type="text" class="share-url" id="share_url" readonly value="<?php echo htmlspecialchars($strShareUrl, ENT_QUOTES, 'UTF-8'); ?>">
<button type="button" class="btn-copy" id="btn_copy_link">Copier le lien</button>
</div>
</div>
<?php } ?>
<div class="steps" aria-hidden="true">
<span class="step <?php echo !$blnShowUrlForm ? 'active' : 'done'; ?>">1</span>
<span class="step-line"></span>
<span class="step <?php echo $blnShowUrlForm ? 'active' : ''; ?>">2</span>
</div>
<?php if ($strMessage !== '') { ?>
<div class="msg <?php echo htmlspecialchars($strMessageClass, ENT_QUOTES, 'UTF-8'); ?>" role="status"><?php
echo htmlspecialchars($strMessage, ENT_QUOTES, 'UTF-8');
?></div>
<?php } ?>
<div class="card">
<?php if (!$blnShowUrlForm) { ?>
<form method="post" action="<?php echo $strBaseUrlHtml; ?>" id="frm_load">
<input type="hidden" name="csrf" value="<?php echo htmlspecialchars($strCsrf, ENT_QUOTES, 'UTF-8'); ?>">
<input type="hidden" name="action" value="load">
<label class="field-label" for="vehicule_no">Numéro de véhicule</label>
<div class="field-wrap">
<input type="text" inputmode="numeric" pattern="[0-9]+" class="input-vehicule" id="vehicule_no" name="vehicule_no" required autofocus placeholder="ex. 8" value="<?php echo htmlspecialchars($strVehiculeSaisi, ENT_QUOTES, 'UTF-8'); ?>">
</div>
<div class="actions">
<button type="submit" class="btn-enter">
<span class="key-cap">↵</span>
<span>Continuer</span>
</button>
<p class="hint">Remplissez le numéro, puis cliquez ou appuyez sur Entrée.</p>
</div>
</form>
<?php } else { ?>
<?php if ($strVehiculeSaisi !== '') { ?>
<p class="hint" style="margin:0 0 1rem;">Véhicule <strong><?php echo htmlspecialchars($strVehiculeSaisi, ENT_QUOTES, 'UTF-8'); ?></strong></p>
<?php } ?>
<form method="post" action="<?php echo $strBaseUrlHtml; ?>" id="frm_save">
<input type="hidden" name="csrf" value="<?php echo htmlspecialchars($strCsrf, ENT_QUOTES, 'UTF-8'); ?>">
<input type="hidden" name="action" value="save">
<input type="hidden" name="pk" value="<?php echo (int) $intPk; ?>">
<input type="hidden" name="vehicule_no" value="<?php echo htmlspecialchars($strVehiculeSaisi, ENT_QUOTES, 'UTF-8'); ?>">
<label class="field-label" for="lien_qr">Lien de votre code QR</label>
<div class="field-wrap">
<input type="url" class="input-lien" id="lien_qr" name="lien_qr" required autofocus placeholder="https://..." value="<?php echo htmlspecialchars($strCurrentHttp, ENT_QUOTES, 'UTF-8'); ?>">
</div>
<div class="actions">
<button type="submit" class="btn-enter">
<span class="key-cap">↵</span>
<span>Enregistrer</span>
</button>
<p class="hint">Ou enregistrer directement le lien par défaut :</p>
</div>
</form>
<form method="post" action="<?php echo $strBaseUrlHtml; ?>" style="margin-top:0.75rem;">
<input type="hidden" name="csrf" value="<?php echo htmlspecialchars($strCsrf, ENT_QUOTES, 'UTF-8'); ?>">
<input type="hidden" name="action" value="save_ms1">
<input type="hidden" name="pk" value="<?php echo (int) $intPk; ?>">
<input type="hidden" name="vehicule_no" value="<?php echo htmlspecialchars($strVehiculeSaisi, ENT_QUOTES, 'UTF-8'); ?>">
<button type="submit" class="btn-ms1">Mettre le lien vers ms1.ca</button>
</form>
<p class="hint" style="margin-top:0.75rem;">Sinon modifiez ladresse ci-dessus et appuyez sur Entrée pour enregistrer.</p>
<?php } ?>
</div>
<?php if ($blnShowUrlForm) { ?>
<p class="back"><a href="<?php echo $strBaseUrlHtml; ?>">← Autre numéro de véhicule</a></p>
<?php } ?>
</div>
<?php if ($blnCanShareLink && $strShareUrl !== '') { ?>
<script>
(function () {
var btn = document.getElementById('btn_copy_link');
var input = document.getElementById('share_url');
if (!btn || !input) return;
btn.addEventListener('click', function () {
input.select();
input.setSelectionRange(0, 99999);
var ok = false;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(input.value).then(function () { ok = true; });
}
try { ok = document.execCommand('copy') || ok; } catch (e) {}
btn.textContent = ok ? 'Copié !' : 'Sélectionné — Ctrl+C';
setTimeout(function () { btn.textContent = 'Copier le lien'; }, 2000);
});
})();
</script>
<?php } ?>
</body>
</html>

View File

@ -2636,14 +2636,16 @@ function fxShowBibTool4($str_code, $int_eve_id, $strLangue){
$tabBibStats=fxInfosBibRange(intval($tabEpreuves[$i]['epr_id']));
$infoBib = fxInfosBibEpreuve(intval($tabEpreuves[$i]['epr_id']));
// MSIN-4379 — Étape 2 : détecte si l'auto est actif (au moins une séquence epr_bib_auto=1).
// Prochain tour : étape 67 (assignation à l'achat).
$blnAutoActive = fxIsBibAutoActive((int)$tabEpreuves[$i]['epr_id']);
?>
<div class="epr-row <?php echo $strClass ?>"
data-epr-id="<?php echo (int)$tabEpreuves[$i]['epr_id']; ?>">
<?php /* MSIN-4379 — Étape 2 : attributs/data pour l'état auto au chargement de la page. */ ?>
<div class="epr-row <?php echo $strClass ?><?php echo $blnAutoActive ? ' auto-enabled' : ''; ?>"
data-epr-id="<?php echo (int)$tabEpreuves[$i]['epr_id']; ?>"
data-auto-active="<?php echo $blnAutoActive ? '1' : '0'; ?>">
<!-- GAUCHE -->
<div class="epr-block">
<div class="epr-header">Épreuve</div>
@ -2786,8 +2788,26 @@ if ($teamMode <= 0) {
style="<?php echo ((int)$infoBib['avec_bib'] > 0 ? '' : 'display:none;'); ?>">
Réinitialiser
</button>
<button type="button" class="btn btn-sm btn-secondary btn-auto">Activer automatique</button>
<?php /* MSIN-4379 — Étape 2 : boutons et bloc UI pour configurer l'assignation auto (sans assigner encore). */ ?>
<button type="button"
class="btn btn-sm btn-auto <?php echo $blnAutoActive ? 'btn-success' : 'btn-secondary'; ?>">
<?php echo $blnAutoActive ? 'Configurer automatique' : 'Activer automatique'; ?>
</button>
<span class="bib-auto-badge badge badge-success ml-1"
style="<?php echo $blnAutoActive ? '' : 'display:none;'; ?>">Auto actif</span>
<div class="auto-config-container" style="display:none;">
<div class="auto-info text-muted small mb-2">
Sélectionnez les séquences utilisées à l'inscription.
</div>
<button type="button" class="btn btn-sm btn-success btn-accepter-auto">Accepter</button>
<button type="button" class="btn btn-sm btn-secondary btn-annuler-auto">Annuler</button>
<button type="button"
class="btn btn-sm btn-danger btn-desactiver-auto"
style="<?php echo $blnAutoActive ? '' : 'display:none;'; ?>">
Désactiver automatique
</button>
</div>
<div class="batch-config-container" style="display:none;">
<?php
@ -2840,6 +2860,7 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
b.epr_id,
b.epr_bib_start,
b.epr_bib_finish,
b.epr_bib_auto, /* MSIN-4379 — Étape 1 : flag par séquence (pool auto). */
COUNT(p.no_bib) AS nb_utilises,
MAX(p.no_bib) AS dernier_bib,
@ -2935,13 +2956,100 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
b.epr_bib_id,
b.epr_id,
b.epr_bib_start,
b.epr_bib_finish
b.epr_bib_finish,
b.epr_bib_auto
ORDER BY b.epr_bib_start
";
return $objDatabase->fxGetResults($sqlBibStats);
}
/**
* MSIN-4379 — Étape 2
* Indique si l'assignation automatique est active pour une épreuve
* (au moins une ligne epr_bib_auto = 1 dans inscriptions_epreuves_bib).
* Prochain tour : étape 67 (lecture de ce flag à l'inscription).
*/
function fxIsBibAutoActive($epr_id) {
global $objDatabase;
$epr_id = intval($epr_id);
if ($epr_id <= 0) {
return false;
}
$sql = "
SELECT COUNT(*)
FROM inscriptions_epreuves_bib
WHERE epr_id = $epr_id
AND epr_bib_auto = 1
";
return (int)$objDatabase->fxGetVar($sql) > 0;
}
/**
* MSIN-4379 — Étape 2
* Enregistre la config auto : remet toutes les séquences à 0, puis marque
* epr_bib_auto = 1 sur les epr_bib_id choisis. Si $active = false, tout désactive.
* Prochain tour : étape 6 lira ces séquences pour fxAssignAutoBibForParticipant().
*/
function fxSaveBibAutoConfig($epr_id, $ranges, $active = true) {
global $objDatabase;
$epr_id = intval($epr_id);
$active = (bool)$active;
if ($epr_id <= 0) {
return ['success' => false, 'message' => 'epr_id invalide'];
}
$objDatabase->fxQuery("
UPDATE inscriptions_epreuves_bib
SET epr_bib_auto = 0
WHERE epr_id = $epr_id
");
if (!$active) {
return ['success' => true, 'auto_active' => false];
}
if (empty($ranges) || !is_array($ranges)) {
return ['success' => false, 'message' => 'Aucune séquence sélectionnée'];
}
$ids = array_values(array_filter(array_map('intval', $ranges)));
if (empty($ids)) {
return ['success' => false, 'message' => 'Aucune séquence sélectionnée'];
}
$strIds = implode(',', $ids);
$sqlCheck = "
SELECT COUNT(*)
FROM inscriptions_epreuves_bib
WHERE epr_id = $epr_id
AND epr_bib_id IN ($strIds)
";
$nbValid = (int)$objDatabase->fxGetVar($sqlCheck);
if ($nbValid !== count($ids)) {
return ['success' => false, 'message' => 'Séquences invalides pour cette épreuve'];
}
$objDatabase->fxQuery("
UPDATE inscriptions_epreuves_bib
SET epr_bib_auto = 1
WHERE epr_id = $epr_id
AND epr_bib_id IN ($strIds)
");
return ['success' => true, 'auto_active' => true];
}
function fxInfosBibEpreuve($epr_id){
global $objDatabase;
@ -3074,12 +3182,22 @@ if (
$showCheckbox = true;
}
// MSIN-4379 — Étape 2 : mode « auto » — checkbox sur chaque séquence enregistrée.
if (
$mode === 'auto'
&& (int)$range['epr_bib_id'] > 0
) {
$showCheckbox = true;
}
?>
<?php if ($showCheckbox) { ?>
<input type="checkbox"
class="batch-select-range"
data-range-id="<?php echo (int)$range['epr_bib_id']; ?>">
data-range-id="<?php echo (int)$range['epr_bib_id']; ?>"
<?php /* MSIN-4379 — Étape 2 : pré-cocher les séquences déjà en epr_bib_auto = 1. */ ?>
<?php if ($mode === 'auto' && (int)($range['epr_bib_auto'] ?? 0) === 1) { ?>checked<?php } ?>>
<?php } ?>
</div>
@ -3447,6 +3565,7 @@ function fxGetRangesForBatchAssign($epr_id, $ranges) {
// =====================
$out = [];
if (is_array($rows)) {
foreach ($rows as $r) {
$start = (int)$r['epr_bib_start'];
@ -3461,6 +3580,7 @@ function fxGetRangesForBatchAssign($epr_id, $ranges) {
];
}
}
}
return $out;
}
@ -3523,8 +3643,10 @@ function fxLoadUsedBibsForBatch($epr_id) {
";
$rows = $objDatabase->fxGetResults($sql);
foreach ($rows as $r) {
$usedBib[(int)$r['no_bib']] = true;
if (is_array($rows)) {
foreach ($rows as $r) {
$usedBib[(int)$r['no_bib']] = true;
}
}
return $usedBib;

View File

@ -7,10 +7,17 @@
* Constantes *
*
**************/
define('_VERSION_CODE', '4.72.54');
define('_DATE_CODE', '2026-03-09');
define('_VERSION_CODE', '4.72.60');
define('_DATE_CODE', '2026-06-02');
//MSIN-4290
define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');
// Outil temporaire ms1_kc_set.php — modifier key_chain_http (lien /kc/{pk}/)
// KEYCHAIN_HTTP_EDIT_SECRET : paramètre ?k= dans lURL (mot de passe daccès à la page)
// KEYCHAIN_HTTP_EDIT_SHIFT : ajouté au numéro saisi (ex. 8 → pk 108 en base)
// KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS : com_id autorisés (virgules) pour /ms1_kc_set.php sans ?k=
define('KEYCHAIN_HTTP_EDIT_SECRET', 'ms1_kc_http_edit_2026_c7e4a91f3b2d8e0f6a5c4b3d2e1f0a9');
define('KEYCHAIN_HTTP_EDIT_SHIFT', 100);
define('KEYCHAIN_HTTP_EDIT_ALLOWED_COM_IDS', '');
/**********************
*

View File

@ -600,6 +600,9 @@ function fxrapportexcell_array($headers,$data,$memexcfichier,$memexctitre) {
}
function fxupload_excel_fnq($mem_fichier) {
/** Include PHPExcel */
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
require_once dirname(__FILE__) . '/Classes/PHPExcel.php';
$objReader = new PHPExcel_Reader_Excel2007();
$objReader->setReadDataOnly(false);
@ -621,13 +624,14 @@ function fxupload_excel_fnq($mem_fichier) {
$counter = 0;
//echo('test');
foreach ($mem_rows as $r) {
//echosl($counter);
if ($counter != 0) {
// $sqlInsert = "INSERT INTO inscriptions_tq set tq_nom='" . $GLOBALS['db']->fxEscape(htmlentities(trim( trim($r[0])), ENT_QUOTES, 'UTF-8')) . "',tq_prenom='" . $GLOBALS['db']->fxEscape(htmlentities(trim($r[1]), ENT_QUOTES, 'UTF-8')) . "',tq_no='" . $r[2] . "',tq_adhesion='" . $r[3] . "',tq_naissance='" . $r[4] . "',tq_echeance='" . $r[5] . "',tq_sexe='" . $r[6] . "',tq_timeupdate=now()";
//print_r($r);
$newDate = date("Y-m-d", strtotime($r[7]));
//print_rsl($r);
$newDate = date("Y-m-d", strtotime($r[3]));
//echo("<br>");
$sqlInsert = "INSERT INTO inscriptions_fnq set tq_no='" . $r[3] . "',tq_naissance='" . $newDate . "',tq_timeupdate=now()";
$sqlInsert = "INSERT INTO inscriptions_fnq set tq_nom='" . $GLOBALS['db']->fxEscape($r[0]) . "',tq_prenom='" . $GLOBALS['db']->fxEscape($r[1] ). "',tq_sexe='" . $r[2] . "', tq_no='" . $r[4] . "',tq_naissance='" . $newDate . "',tq_timeupdate=now()";
$qryInsert = $GLOBALS['db']->fxQuery($sqlInsert);
}
@ -635,7 +639,7 @@ function fxupload_excel_fnq($mem_fichier) {
}
//echo($counter);
return $counter;
return $counter-1;
}
function fxupload_excel_triathlonv2($mem_fichier) {