[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 | applied: dict = dict(extra_facets or {}) | 180 | applied: dict = dict(extra_facets or {}) | ||
| 181 | offset = 0 | 181 | offset = 0 | ||
| 182 | total = 0 | 182 | total = 0 | ||
| 183 | + unfiltered_total = 0 | ||||
| 183 | first = True | 184 | first = True | ||
| 185 | + qc_retried = False | ||||
| 184 | for _ in range(self.max_pages): | 186 | for _ in range(self.max_pages): | ||
| 185 | data = self._req_json("post", url, | 187 | data = self._req_json("post", url, | ||
| 186 | json={"appliedFacets": applied, | 188 | json={"appliedFacets": applied, | ||
@@ -189,6 +191,7 @@ class WorkdayConnector(BaseConnector): | |||||
| 189 | if first: | 191 | if first: | ||
| 190 | first = False | 192 | first = False | ||
| 191 | self._first_facets = data.get("facets") or [] | 193 | self._first_facets = data.get("facets") or [] | ||
| 194 | + unfiltered_total = int(data.get("total") or 0) | ||||
| 192 | if self.quebec_only: | 195 | if self.quebec_only: | ||
| 193 | qc = self._find_qc_facet(data.get("facets")) | 196 | qc = self._find_qc_facet(data.get("facets")) | ||
| 194 | if qc: | 197 | if qc: | ||
@@ -200,6 +203,18 @@ class WorkdayConnector(BaseConnector): | |||||
| 200 | continue | 203 | continue | ||
| 201 | items = data.get("jobPostings") or [] | 204 | items = data.get("jobPostings") or [] | ||
| 202 | if not items: | 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 | return | 218 | return | ||
| 204 | yield from items | 219 | yield from items | ||
| 205 | offset += PAGE_SIZE | 220 | offset += PAGE_SIZE | ||
| 206 | 221 | ||||