[ka6] fix connecteur dxctechnology: repli scan client quand le filtre serveur QC est factice dans la plateforme workday — le tenant dxctechnology (dxctechnology.wd1, site DXCJobs) expose une facette « locations » (Region, State or Province) qui liste « CAN - QC - MONTREAL » count=3 mais dont le filtre serveur renvoie total=0 pour N'IMPORTE QUELLE valeur (vérifié aussi avec DUBAI count=2 → 0) : facette d'affichage seulement. Le repli serveur ajouté ce matin pour jj (ec1b90d, déployé 04h18) sélectionnait cette facette factice → pagination filtrée vide → found=0 au sync de 04h45 (missed=3), statut stale, alors que les 3 offres Montréal existent toujours sur l'API. _list_pages détecte désormais le cas : si la première page filtrée serveur est vide alors que le listing non filtré annonçait des postes (total > 0), le filtre serveur est abandonné (une seule fois) et le scan client complet reprend (938 postes < plafond 60×20, is_quebec_location côté client). Sync rejoué : found=3 (médiane 3.0), les 3 offres réactivées miss_count=0. Non-régression : jj garde son repli serveur (found=1 en 1,9 s), desjardins sa facette province (found=270). pm2 restart job-ka-sync OK, site 200.
1 changed file +15 −0
modified
jobka/connectors/workday.py
+15 −0
@@ -180,7 +180,9 @@ class WorkdayConnector(BaseConnector): | ||
| 180 | 180 | applied: dict = dict(extra_facets or {}) |
| 181 | 181 | offset = 0 |
| 182 | 182 | total = 0 |
| 183 | + unfiltered_total = 0 | |
| 183 | 184 | first = True |
| 185 | + qc_retried = False | |
| 184 | 186 | for _ in range(self.max_pages): |
| 185 | 187 | data = self._req_json("post", url, |
| 186 | 188 | json={"appliedFacets": applied, |
@@ -189,6 +191,7 @@ class WorkdayConnector(BaseConnector): | ||
| 189 | 191 | if first: |
| 190 | 192 | first = False |
| 191 | 193 | self._first_facets = data.get("facets") or [] |
| 194 | + unfiltered_total = int(data.get("total") or 0) | |
| 192 | 195 | if self.quebec_only: |
| 193 | 196 | qc = self._find_qc_facet(data.get("facets")) |
| 194 | 197 | if qc: |
@@ -200,6 +203,18 @@ class WorkdayConnector(BaseConnector): | ||
| 200 | 203 | continue |
| 201 | 204 | items = data.get("jobPostings") or [] |
| 202 | 205 | if not items: |
| 206 | + # Facette factice (tenant dxctechnology, constaté 2026-09-10) : | |
| 207 | + # la facette « locations » annonce des postes QC (count > 0) | |
| 208 | + # mais le filtre serveur renvoie 0 résultat quelle que soit la | |
| 209 | + # valeur. Plutôt que de conclure à 0 offre, abandonner le | |
| 210 | + # filtre serveur et revenir au scan client complet. | |
| 211 | + if (self._server_filtered and offset == 0 and not qc_retried | |
| 212 | + and unfiltered_total): | |
| 213 | + qc_retried = True | |
| 214 | + applied = dict(extra_facets or {}) | |
| 215 | + self._qc_facet = None | |
| 216 | + self._server_filtered = False | |
| 217 | + continue | |
| 203 | 218 | return |
| 204 | 219 | yield from items |
| 205 | 220 | offset += PAGE_SIZE |
| 206 | 221 | |