# ============================================================================= # Job·Ka — Groupe KA # Auteur : Simon-Pierre Boucher # Contact : contact@spboucher.ai # Fichier : jobka/connectors/quadreal.py # Rôle : Connecteur QuadReal — workday (tenant quadreal.wd10), balayage des # deux sites carrières du tenant : Parkbridge + QuadReal # [généré par scripts/gen_connectors.py, flux vérifié le 2026-08-23] # Créé : 2026-08-23 Modifié : 2026-09-18 # ============================================================================= """QuadReal Property Group expose DEUX sites carrières sur le même tenant Workday `quadreal.wd10` : `Parkbridge` (filiale Parkbridge Lifestyle Communities) et `QuadReal` (site principal corporate). Contexte 2026-09-10 : le connecteur ne balayait que `Parkbridge`, dont l'unique offre QC historique (R0006877, Préposé à l'entretien ménager, Magog) a été dépubliée par l'employeur (détail 403 « permission denied », recherche par mot-clé et ID → 0, facette province réduite à AB/ON/BC sur 7 postes). Pendant ce temps le site principal `QuadReal` publiait 68 postes dont 1 au Québec (R0006871, Property Administrator/Administrateur immobilier, Montréal) — invisible pour le connecteur. fetch() balaie désormais `Parkbridge` PUIS `QuadReal` et déduplique par external_id (jobReqId, unique au tenant) ; le SITE est permuté en attribut d'instance, la classe plateforme et les autres tenants workday restent intacts. Re-vérifié le 2026-09-18 : l'offre R0006871 (Montréal) a été dépubliée à la source (détail 404, recherche par ID → 0) — les deux sites n'ont AUCUNE offre QC (facettes provinces = AB/ON/BC/NY/CA sur 8 + 69 postes, offres multi-lieux toutes Vancouver/Calgary/Toronto). 0 est le volume légitime tant que QuadReal ne republie pas au Québec.""" from ..schema import JobPosting from .workday import WorkdayConnector class QuadrealConnector(WorkdayConnector): source_id = 'quadreal' EMPLOYER = 'QuadReal' TENANT = 'quadreal' HOST = 'wd10' SITE = 'Parkbridge' EXTRA_SITES = ('QuadReal',) def fetch(self) -> list[JobPosting]: jobs = super().fetch() # site Parkbridge (défaut) seen = {j.external_id for j in jobs} for site in self.EXTRA_SITES: self.SITE = site # attribut d'instance : la try: # classe (autres tenants) extra = super().fetch() # n'est pas modifiée finally: self.SITE = type(self).SITE jobs.extend(j for j in extra if j.external_id not in seen) seen.update(j.external_id for j in extra) return jobs