Files
ms1inscription-v5/php/chronotrack_api/fx_chronotrack_config.php
stephan 121186a0b9 Update version code and integrate MSIN API ChronoTrack functionality
This commit updates the version code to 4.72.725 and introduces the `fxSettingsApplyChronotrackApi` function to manage ChronoTrack API credentials based on the environment. It also adds relevant UI elements in the sidebar and form sections for ChronoTrack configuration, enhancing the integration of ChronoTrack features within the application.
2026-07-02 18:10:51 -04:00

215 lines
8.1 KiB
PHP

<?php
/**
* MSIN API ChronoTrack — config par eve_id (lien event, statut, mapping épreuves).
*/
function fxChronotrackApiConfigGet($intEveId) {
global $objDatabase;
$intEveId = intval($intEveId);
if ($intEveId <= 0) {
return null;
}
$sql = "SELECT * FROM api_chronotrack_config WHERE eve_id = " . $intEveId . " LIMIT 1";
return $objDatabase->fxGetRow($sql);
}
function fxChronotrackApiConfigStatusLabel($strStatus) {
switch ($strStatus) {
case MSIN_API_CHRONOTRACK_SYNC_ACTIF:
return 'Actif';
case MSIN_API_CHRONOTRACK_SYNC_FERME:
return 'Fermé';
case MSIN_API_CHRONOTRACK_SYNC_LIE:
default:
return 'Lié';
}
}
function fxChronotrackApiConfigSaveLink($intEveId, $intCtEventId, $strCtEventName, $strCtEventDate, $intUsaId) {
global $objDatabase;
$intEveId = intval($intEveId);
$intCtEventId = intval($intCtEventId);
if ($intEveId <= 0 || $intCtEventId <= 0) {
return array('state' => 'error', 'message' => 'Identifiants invalides');
}
$arrExisting = fxChronotrackApiConfigGet($intEveId);
if ($arrExisting !== null && $arrExisting['sync_status'] === MSIN_API_CHRONOTRACK_SYNC_FERME) {
return array('state' => 'error', 'message' => 'Événement fermé — réouverture non autorisée depuis cette interface.');
}
$strName = $objDatabase->fxEscape(trim($strCtEventName));
$strDateSql = 'NULL';
if (trim($strCtEventDate) !== '') {
$intTs = strtotime($strCtEventDate);
if ($intTs !== false) {
$strDateSql = "'" . $objDatabase->fxEscape(date('Y-m-d H:i:s', $intTs)) . "'";
}
}
if ($arrExisting === null) {
$sql = "INSERT INTO api_chronotrack_config SET eve_id = " . $intEveId
. ", ct_event_id = " . $intCtEventId
. ", ct_event_name = '" . $strName . "'"
. ", ct_event_date = " . $strDateSql
. ", sync_status = '" . MSIN_API_CHRONOTRACK_SYNC_LIE . "'"
. ", linked_at = '" . fxGetDateTime() . "'"
. ", linked_by_usa_id = " . intval($intUsaId)
. ", updated_at = '" . fxGetDateTime() . "'";
} else {
$sql = "UPDATE api_chronotrack_config SET ct_event_id = " . $intCtEventId
. ", ct_event_name = '" . $strName . "'"
. ", ct_event_date = " . $strDateSql
. ", updated_at = '" . fxGetDateTime() . "'"
. " WHERE eve_id = " . $intEveId
. " AND sync_status <> '" . MSIN_API_CHRONOTRACK_SYNC_FERME . "'";
}
if (!$objDatabase->fxQuery($sql)) {
return array('state' => 'error', 'message' => 'Erreur SQL enregistrement lien');
}
return array('state' => 'ok');
}
function fxChronotrackApiConfigSetStatus($intEveId, $strStatus, $intUsaId) {
global $objDatabase;
$intEveId = intval($intEveId);
$arrExisting = fxChronotrackApiConfigGet($intEveId);
if ($arrExisting === null) {
return array('state' => 'error', 'message' => 'Aucun lien ChronoTrack pour cet événement');
}
if ($arrExisting['sync_status'] === MSIN_API_CHRONOTRACK_SYNC_FERME) {
return array('state' => 'error', 'message' => 'Événement déjà fermé');
}
$strStatus = trim($strStatus);
if (!in_array($strStatus, array(MSIN_API_CHRONOTRACK_SYNC_LIE, MSIN_API_CHRONOTRACK_SYNC_ACTIF, MSIN_API_CHRONOTRACK_SYNC_FERME), true)) {
return array('state' => 'error', 'message' => 'Statut invalide');
}
$strExtra = '';
if ($strStatus === MSIN_API_CHRONOTRACK_SYNC_ACTIF) {
$strExtra = ", activated_at = '" . fxGetDateTime() . "'";
}
if ($strStatus === MSIN_API_CHRONOTRACK_SYNC_FERME) {
$strExtra = ", closed_at = '" . fxGetDateTime() . "', closed_by_usa_id = " . intval($intUsaId);
}
$sql = "UPDATE api_chronotrack_config SET sync_status = '" . $objDatabase->fxEscape($strStatus) . "'"
. $strExtra
. ", updated_at = '" . fxGetDateTime() . "'"
. " WHERE eve_id = " . $intEveId;
if (!$objDatabase->fxQuery($sql)) {
return array('state' => 'error', 'message' => 'Erreur SQL changement statut');
}
return array('state' => 'ok');
}
function fxChronotrackApiRaceMapGetForEvent($intEveId) {
global $objDatabase;
$sql = "SELECT * FROM api_chronotrack_race_map WHERE eve_id = " . intval($intEveId);
$arrRows = $objDatabase->fxGetResults($sql);
$arrMap = array();
if ($arrRows !== null) {
for ($i = 1; $i <= count($arrRows); $i++) {
$arrMap[intval($arrRows[$i]['epr_id'])] = $arrRows[$i];
}
}
return $arrMap;
}
function fxChronotrackApiMs1EpreuvesForEvent($intEveId, $strLangue = 'fr') {
global $objDatabase;
$strLangue = ($strLangue === 'en') ? 'en' : 'fr';
$sql = "SELECT epr_id, epr_nom_" . $strLangue . " AS epr_nom, epr_type_" . $strLangue . " AS epr_type, epr_date"
. " FROM inscriptions_epreuves WHERE eve_id = " . intval($intEveId)
. " ORDER BY epr_date, epr_nom_" . $strLangue;
return $objDatabase->fxGetResults($sql);
}
function fxChronotrackApiRaceMapSave($intEveId, $arrMapInput) {
global $objDatabase;
$intEveId = intval($intEveId);
$arrExisting = fxChronotrackApiConfigGet($intEveId);
if ($arrExisting === null) {
return array('state' => 'error', 'message' => 'Lier d\'abord un événement ChronoTrack');
}
if ($arrExisting['sync_status'] === MSIN_API_CHRONOTRACK_SYNC_FERME) {
return array('state' => 'error', 'message' => 'Événement fermé — mapping en lecture seule');
}
if (!is_array($arrMapInput)) {
return array('state' => 'error', 'message' => 'Mapping invalide');
}
foreach ($arrMapInput as $intEprId => $arrRace) {
$intEprId = intval($intEprId);
$intCtRaceId = intval($arrRace['ct_race_id'] ?? 0);
$strCtRaceName = trim((string)($arrRace['ct_race_name'] ?? ''));
if ($intEprId <= 0) {
continue;
}
if ($intCtRaceId <= 0) {
$sqlDel = "DELETE FROM api_chronotrack_race_map WHERE eve_id = " . $intEveId . " AND epr_id = " . $intEprId;
$objDatabase->fxQuery($sqlDel);
continue;
}
$sqlExists = "SELECT map_id FROM api_chronotrack_race_map WHERE eve_id = " . $intEveId
. " AND epr_id = " . $intEprId . " LIMIT 1";
if ($objDatabase->fxGetRow($sqlExists) !== null) {
$sql = "UPDATE api_chronotrack_race_map SET ct_race_id = " . $intCtRaceId
. ", ct_race_name = '" . $objDatabase->fxEscape($strCtRaceName) . "'"
. ", updated_at = '" . fxGetDateTime() . "'"
. " WHERE eve_id = " . $intEveId . " AND epr_id = " . $intEprId;
} else {
$sql = "INSERT INTO api_chronotrack_race_map SET eve_id = " . $intEveId
. ", epr_id = " . $intEprId
. ", ct_race_id = " . $intCtRaceId
. ", ct_race_name = '" . $objDatabase->fxEscape($strCtRaceName) . "'"
. ", updated_at = '" . fxGetDateTime() . "'";
}
$objDatabase->fxQuery($sql);
}
return array('state' => 'ok');
}
function fxChronotrackApiMs1EventRow($intEveId, $strLangue = 'fr') {
global $objDatabase;
$strLangue = ($strLangue === 'en') ? 'en' : 'fr';
$sql = "SELECT eve_id, eve_nom_" . $strLangue . " AS eve_nom, eve_date_debut, eve_date_fin"
. " FROM inscriptions_evenements WHERE eve_id = " . intval($intEveId) . " LIMIT 1";
return $objDatabase->fxGetRow($sql);
}
function fxChronotrackApiListActiveConfigs($arrStatuses = null) {
global $objDatabase;
if ($arrStatuses === null) {
$arrStatuses = array(MSIN_API_CHRONOTRACK_SYNC_LIE, MSIN_API_CHRONOTRACK_SYNC_ACTIF);
}
$arrEsc = array();
foreach ($arrStatuses as $strStatus) {
$arrEsc[] = "'" . $objDatabase->fxEscape($strStatus) . "'";
}
$sql = "SELECT c.*, e.eve_nom_fr AS eve_nom"
. " FROM api_chronotrack_config c"
. " INNER JOIN inscriptions_evenements e ON e.eve_id = c.eve_id"
. " WHERE c.sync_status IN (" . implode(',', $arrEsc) . ")"
. " ORDER BY c.sync_status DESC, c.updated_at DESC";
return $objDatabase->fxGetResults($sql);
}