[ka6] fix connecteur jj: filtre serveur de repli par lieux ville dans la plateforme workday — le tenant jj (Johnson & Johnson, jj.wd5) n'expose AUCUNE facette province « Quebec », seulement une facette locations plate au niveau ville (« Montréal, Quebec, Canada ») ; sans filtre serveur, le scan client plafonné à max_pages=60 (1200 postes) ratait l'unique offre QC dès que le tenant a dépassé le plafond (1692 postes le 2026-09-10) → found=0, statut stale. _find_qc_facet agrège désormais, en repli seulement, toutes les valeurs de lieu québécoises (mêmes règles que is_quebec_location) en un filtre serveur unique. Sync rejoué : found=1 en 2,8 s (vs 0 en 72,5 s), offre R-089236 Montréal réactivée (miss_count=0) ; les 2 retraits (R-093383, R-081608) vérifiés réellement dépubliés sur l'API. Non-régression : desjardins garde sa facette province Region et rapporte 270 offres. pm2 restart job-ka-sync OK, site 200.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 changed file +22 −1
modified
jobka/connectors/workday.py
+22 −1
@@ -5,7 +5,7 @@ | ||
| 5 | 5 | # Fichier : jobka/connectors/workday.py |
| 6 | 6 | # Rôle : Classe de plateforme Workday (API JSON publique wday/cxs) — un |
| 7 | 7 | # employeur = une sous-classe de ~10 lignes (TENANT, HOST, SITE) |
| 8 | −# Créé : 2026-08-17 Modifié : 2026-09-07 | |
| 8 | +# Créé : 2026-08-17 Modifié : 2026-09-10 | |
| 9 | 9 | # ============================================================================= |
| 10 | 10 | """Plateforme Workday. |
| 11 | 11 | |
@@ -122,6 +122,27 @@ class WorkdayConnector(BaseConnector): | ||
| 122 | 122 | found = walk(f.get("facetParameter"), f.get("values")) |
| 123 | 123 | if found: |
| 124 | 124 | return found |
| 125 | + # Repli (tenant jj, constaté 2026-09-10) : certains tenants n'exposent | |
| 126 | + # AUCUN niveau province — seulement une facette de lieux plate au | |
| 127 | + # niveau ville (« Montréal, Quebec, Canada »). Sans filtre serveur, le | |
| 128 | + # scan client plafonné par max_pages rate les offres QC dès que le | |
| 129 | + # tenant dépasse le plafond (jj : 1692 postes > 60 × 20). On agrège | |
| 130 | + # alors toutes les valeurs de lieu québécoises (mêmes règles que le | |
| 131 | + # filtre client is_quebec_location) en un seul filtre serveur. | |
| 132 | + by_param: dict[str, list] = {} | |
| 133 | + | |
| 134 | + def collect(param: str | None, values: list) -> None: | |
| 135 | + for v in values or []: | |
| 136 | + p = v.get("facetParameter") or param | |
| 137 | + desc = (v.get("descriptor") or "").strip() | |
| 138 | + if p and v.get("id") and is_quebec_location(desc): | |
| 139 | + by_param.setdefault(p, []).append(v["id"]) | |
| 140 | + collect(p, v.get("values")) | |
| 141 | + for f in facets or []: | |
| 142 | + collect(f.get("facetParameter"), f.get("values")) | |
| 143 | + if by_param: | |
| 144 | + param = max(by_param, key=lambda k: len(by_param[k])) | |
| 145 | + return {param: by_param[param]} | |
| 125 | 146 | return None |
| 126 | 147 | |
| 127 | 148 | # facette « Remote Type » (présente sur beaucoup de tenants) : libellé |
| 128 | 149 | |