From 0db8da98102526717da4361b5a4aabcccaee0fcc Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 14 Jul 2026 12:08:03 -0400 Subject: [PATCH] Implement auto-sync configuration for ChronoTrack API. Add functionality to save auto-sync settings, including frequency and end date, enhancing user control over synchronization. Update push panel to reflect new options and improve user feedback during the sync process. This change lays the groundwork for future cron integration. --- php/chronotrack_api/fx_chronotrack_admin.php | 115 +++++++++++++++++- php/chronotrack_api/fx_chronotrack_config.php | 73 +++++++++++ ...MSIN-4328-chronotrack-auto-sync-config.sql | 57 +++++++++ superadm/ajax_chronotrack_api.php | 12 ++ 4 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 sql/MSIN-4328-chronotrack-auto-sync-config.sql diff --git a/php/chronotrack_api/fx_chronotrack_admin.php b/php/chronotrack_api/fx_chronotrack_admin.php index 0cc5238..f9380e1 100644 --- a/php/chronotrack_api/fx_chronotrack_admin.php +++ b/php/chronotrack_api/fx_chronotrack_admin.php @@ -103,7 +103,7 @@ function fxChronotrackApiAdminRenderEventPage($intEveId, $strLangue = 'fr', $bln // Sync d’abord (usage courant) ; config repliable ensuite. MSIN-4328 if ($arrConfig !== null && $blnEventLinked && $blnConfigured) { - fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed); + fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed, $arrConfig); } if ($arrConfig !== null && $blnEventLinked) { @@ -244,7 +244,7 @@ function fxChronotrackApiAdminRenderRaceMapping($intEveId, $arrConfig, $strLangu echo ''; } -function fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed = false) { +function fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed = false, $arrConfig = null) { echo '
'; echo '
Synchronisation ChronoTrack
'; echo '
'; @@ -252,7 +252,63 @@ function fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed = false) { echo '
Événement fermé — envoi manuel encore possible.
'; } - // Zone employé : statut clair + actions d’abord. MSIN-4328 + // MSIN-4328 — Phase A : config sync auto (exécutée plus tard par cron) + $blnAutoOn = (intval($arrConfig['auto_sync_enabled'] ?? 0) === 1); + $intAutoInterval = intval($arrConfig['auto_sync_interval_min'] ?? 15); + if (!in_array($intAutoInterval, array(1, 5, 15, 30, 60), true)) { + $intAutoInterval = 15; + } + $strUntilRaw = trim((string)($arrConfig['auto_sync_until'] ?? '')); + $strUntilLocal = ''; + if ($strUntilRaw !== '' && $strUntilRaw !== '0000-00-00 00:00:00') { + $intUntilTs = strtotime($strUntilRaw); + if ($intUntilTs !== false) { + $strUntilLocal = date('Y-m-d\TH:i', $intUntilTs); + } + } + + echo '
'; + echo '
'; + echo ''; + echo ''; + echo '
'; + echo '
'; + echo '
'; + echo ''; + echo '
'; + echo '
'; + echo ''; + echo ''; + echo '
'; + if (!$blnClosed) { + echo '
'; + echo ''; + echo '
'; + } + echo '
'; + echo '

'; + if ($blnAutoOn && $strUntilRaw !== '') { + echo 'Config enregistrée — exécution serveur (cron) à brancher. Arrêt prévu : ' + . fxChronotrackApiAdminEsc($strUntilRaw) . '.'; + } else { + echo 'Quand c’est coché, le serveur (cron) poussera le différentiel à cet intervalle jusqu’à la date de fin. ' + . 'Pas encore actif côté serveur.'; + } + echo '

'; + echo '
'; + echo '
'; + + // Zone employé : statut clair + actions echo '
'; echo '
Cliquez Actualiser pour vérifier s’il y a des changements à envoyer.
'; echo '
'; @@ -263,7 +319,7 @@ function fxChronotrackApiAdminRenderPushPanel($intEveId, $blnClosed = false) { echo ''; echo '
'; - echo '

La sync automatique arrivera bientôt — pour l’instant, un clic suffit quand il y a du nouveau.

'; + echo '

Envoi manuel : uniquement les nouveaux / modifiés depuis le dernier push OK.

'; echo '
'; // Détails / debug : sous les boutons, repliés par défaut @@ -355,6 +411,13 @@ function fxChronotrackApiAdminRenderPageScript($intEveId, $arrConfig, $blnClosed } .ct-api-push-actions .btn-lg { font-size: 1.05rem; padding: 0.55rem 1.1rem; } #ct_api_push_details_card .card-header a { text-decoration: none; } +.ct-api-auto-wrap { + padding: 12px 14px; + border-radius: 8px; + border: 1px dashed #adb5bd; + background: #fafbfc; +} +.ct-api-auto-wrap--disabled { opacity: 0.7; }