From c7527bdb03f68fdbccb71d48dd9f19fe0ed13dfd Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 11 Aug 2026 18:50:59 -0400 Subject: [PATCH] =?UTF-8?q?MSIN-4574=20=E2=80=94=20Increment=20version=20c?= =?UTF-8?q?ode=20to=204.73.003=20and=20enhance=20the=20ChronoTrack=20API?= =?UTF-8?q?=20by=20implementing=20logic=20to=20omit=20Canadian=20provinces?= =?UTF-8?q?=20when=20the=20associated=20country=20is=20not=20Canada,=20log?= =?UTF-8?q?ging=20the=20reason=20for=20omission.=20Improved=20feedback=20m?= =?UTF-8?q?essages=20in=20the=20API=20to=20clarify=20the=20handling=20of?= =?UTF-8?q?=20location=20data=20and=20ensure=20accurate=20synchronization.?= =?UTF-8?q?=20Documentation=20updated=20to=20reflect=20these=20changes=20a?= =?UTF-8?q?nd=20enhance=20user=20understanding=20of=20the=20new=20location?= =?UTF-8?q?=20handling=20rules.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/chronotrack/README.md | 4 +- php/chronotrack_api/fx_chronotrack_admin.php | 4 +- .../fx_chronotrack_payload.php | 59 ++++++++++++++++--- php/chronotrack_api/fx_chronotrack_push.php | 19 ++++++ php/chronotrack_api/fx_chronotrack_verify.php | 2 + php/inc_settings.php | 2 +- 6 files changed, 79 insertions(+), 11 deletions(-) diff --git a/docs/chronotrack/README.md b/docs/chronotrack/README.md index 23c99493..8aafb660 100644 --- a/docs/chronotrack/README.md +++ b/docs/chronotrack/README.md @@ -43,7 +43,9 @@ La **liste** meta renvoie plutôt : `fx_chronotrack_verify.php` mappe ces alias — sinon faux écarts « CT ∅ ». **Écriture pays/région** : seulement `location_country` / `location_region` / `country_name` -(pas `country_code` / `state_code` — collision possible → QC dans le pays). +(pas `country_code` / `state_code` — collision possible → QC dans le pays). +Si province **canadienne** (ex. `QC`) et pays MS1 ≠ `CA` → **province non envoyée** + log `skip_region` +(pas de réparation auto du pays ; pas de faux écart à la vérif). **Push** (règle produit MSIN-4574 — **correctitude > vitesse**) : - entry déjà dans CT (`entry_id`) → **PUT** unitaire (écrase pays / région / bib) diff --git a/php/chronotrack_api/fx_chronotrack_admin.php b/php/chronotrack_api/fx_chronotrack_admin.php index 5aa0b06d..9197a74b 100644 --- a/php/chronotrack_api/fx_chronotrack_admin.php +++ b/php/chronotrack_api/fx_chronotrack_admin.php @@ -2022,7 +2022,9 @@ function fxChronotrackApiAdminRenderPageScript($intEveId, $arrConfig, $blnClosed + 'envoi_bib= valeur envoyée, ' + 'conflit_bib = dossard différé (2e passe / swap via PUT clear), ' + 'RETRY_BIB = 2e tentative. ' - + 'Si la 2e passe échoue → erreur visible.

'; + + 'Si la 2e passe échoue → erreur visible. ' + + '
skip_region = province MS1 non envoyée (ex. QC + pays France) ' + + '— saisie incohérente, pas un bug d’envoi.

'; html += '
'; html += ''; html += ''; diff --git a/php/chronotrack_api/fx_chronotrack_payload.php b/php/chronotrack_api/fx_chronotrack_payload.php index 8965ae18..bb66f0f5 100644 --- a/php/chronotrack_api/fx_chronotrack_payload.php +++ b/php/chronotrack_api/fx_chronotrack_payload.php @@ -306,6 +306,42 @@ function fxChronotrackApiSyncIso2ToIso3($strIso2) { return isset($tabMap[$strIso2]) ? $tabMap[$strIso2] : ''; } +/** + * MSIN-4574 — codes province Canada (pro_iso typique). + */ +function fxChronotrackApiSyncIsCanadianProvinceCode($strCode) { + static $tab = array( + 'AB' => 1, 'BC' => 1, 'MB' => 1, 'NB' => 1, 'NL' => 1, 'NS' => 1, + 'NT' => 1, 'NU' => 1, 'ON' => 1, 'PE' => 1, 'QC' => 1, 'SK' => 1, 'YT' => 1, + ); + $strCode = strtoupper(trim((string)$strCode)); + return $strCode !== '' && isset($tab[$strCode]); +} + +/** + * MSIN-4574 — si province CA alors que pays ≠ CA (ex. Kathy : QC + France), + * on n’envoie pas la province (CT refuse) — sans corriger le pays MS1. + * + * @return string raison (vide = OK à envoyer) + */ +function fxChronotrackApiSyncLocationRegionOmitReason($strState, $strCountryIso2) { + $strState = strtoupper(trim((string)$strState)); + $strCountryIso2 = strtoupper(trim((string)$strCountryIso2)); + if ($strState === '') { + return ''; + } + // Pas de pays MS1 → on envoie quand même la province (meilleur effort) + if ($strCountryIso2 === '') { + return ''; + } + if (fxChronotrackApiSyncIsCanadianProvinceCode($strState) && $strCountryIso2 !== 'CA') { + return 'Province ' . $strState . ' non envoyée — pays MS1=' . $strCountryIso2 + . ' (incohérent : CT n’accepte pas une province canadienne hors Canada.' + . ' Corriger le pays en MS1 si besoin).'; + } + return ''; +} + /** * MSIN-4574 — ISO-2 pays (pay_iso BD). * Preuve calibrage 2026-08-11 : CT Athlete Info / export stockent location_country + COUNTRY_CODE = « CA » (pas CAN). @@ -912,18 +948,25 @@ function fxChronotrackApiSyncBuildEntryPayload(array $arrRow, array $arrRaceMap, } if ($strState !== '') { - // MSIN-4574 — n’envoyer QUE location_region (pas state_code) : - // state_code en upsert bulk a pu finir dans location_country côté CT (QC dans le pays). - $arrEntry['location_region'] = $strState; + // MSIN-4574 — ne pas envoyer une province CA/US si le pays MS1 ne match pas + // (ex. QC + France → CT refuse ; pas de « réparation » auto du pays). + $strOmitRegion = fxChronotrackApiSyncLocationRegionOmitReason($strState, $strCountry); + if ($strOmitRegion === '') { + // N’envoyer QUE location_region (pas state_code) : + // state_code en upsert bulk a pu finir dans location_country côté CT (QC dans le pays). + $arrEntry['location_region'] = $strState; + } else { + // Marqueur interne → log push_prepare, retiré avant HTTP / vérif + $arrEntry['_skip_region_log'] = $strOmitRegion; + } } // MSIN-4574 — pays / province (calibrage sonde lecture + export confirmed entries 2026-08-11) : // location_country = ISO-2 (CA), location_region = pro_iso (QC), country_name = libellé. // Pas de country_code en écriture entry (même risque de collision que state_code). - $strIso2 = fxChronotrackApiSyncResolveCountryIso2($arrRow); $strCountryName = fxChronotrackApiSyncResolveCountryLabel($arrRow); - if ($strIso2 !== '') { - $arrEntry['location_country'] = $strIso2; + if ($strCountry !== '') { + $arrEntry['location_country'] = $strCountry; } if ($strCountryName !== '') { $arrEntry['country_name'] = $strCountryName; @@ -956,13 +999,13 @@ function fxChronotrackApiSyncBuildEntryPayload(array $arrRow, array $arrRaceMap, function fxChronotrackApiSyncPayloadForPost(array $arrPayload) { $arrOut = $arrPayload; - unset($arrOut['entry_id']); + unset($arrOut['entry_id'], $arrOut['_skip_region_log']); return $arrOut; } function fxChronotrackApiSyncPayloadForPut(array $arrPayload) { $arrOut = $arrPayload; - unset($arrOut['entry_id']); + unset($arrOut['entry_id'], $arrOut['_skip_region_log']); return $arrOut; } diff --git a/php/chronotrack_api/fx_chronotrack_push.php b/php/chronotrack_api/fx_chronotrack_push.php index 0651b2c2..96679fd4 100644 --- a/php/chronotrack_api/fx_chronotrack_push.php +++ b/php/chronotrack_api/fx_chronotrack_push.php @@ -1047,6 +1047,25 @@ function fxChronotrackApiSyncPushPrepare($intEveId, $arrOptions = array()) { $arrPayload['entry_id'] = $strCtEntryId; $intWithEntryId++; } + // MSIN-4574 — province omise (pays incohérent) → log support, pas de faux écart + if (!empty($arrPayload['_skip_region_log'])) { + $strSkipMsg = trim((string)$arrPayload['_skip_region_log']); + $strSkipName = trim( + trim((string)($arrPayload['first_name'] ?? '')) + . ' ' + . trim((string)($arrPayload['last_name'] ?? '')) + ); + fxChronotrackApiSyncLog( + $intEveId, + intval($arrItem['row']['par_id'] ?? 0), + 'skip_region', + 'ok', + ($strSkipName !== '' ? ($strSkipName . ' — ') : '') + . 'ext ' . ($arrPayload['external_id'] ?? '') + . ' — ' . $strSkipMsg + ); + unset($arrPayload['_skip_region_log']); + } $tabBatch[] = $arrPayload; $strBibMs1 = fxChronotrackApiSyncExtractBib($arrItem['row'] ?? array()); $strBibSent = isset($arrPayload['bib']) ? trim((string)$arrPayload['bib']) : ''; diff --git a/php/chronotrack_api/fx_chronotrack_verify.php b/php/chronotrack_api/fx_chronotrack_verify.php index 44212d75..cefc8e1c 100644 --- a/php/chronotrack_api/fx_chronotrack_verify.php +++ b/php/chronotrack_api/fx_chronotrack_verify.php @@ -20,6 +20,8 @@ function fxChronotrackApiSyncVerifySkipPayloadKeys() { 'status' => true, 'country_code' => true, 'state_code' => true, + // Marqueur interne omit province (jamais comparé / envoyé) + '_skip_region_log' => true, ); } diff --git a/php/inc_settings.php b/php/inc_settings.php index a153b55d..d3e9a090 100644 --- a/php/inc_settings.php +++ b/php/inc_settings.php @@ -7,7 +7,7 @@ * Constantes * * **************/ -define('_VERSION_CODE', '4.73.002'); // MSIN-4574 — correctitude: PUT si entry_id (plus POST bulk update) +define('_VERSION_CODE', '4.73.003'); // MSIN-4574 — omit province CA si pays≠CA + log skip_region define('_DATE_CODE', '2026-08-11'); //MSIN-4290 define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');
QuandActionStatutpar_idMessage