SPB Git

spb/job-ka

Public

[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.

Simon-Pierre Boucher committed (Sep 10, 2026) parent ec1b90d Browse files

1 changed file +15 −0

Unified Split
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
Menu

Theme