SPB Git

spb/job-ka

Public

[ka6] fix connecteur ingeniuinc: migration d'ATS SmartRecruiters → site Odoo de l'employeur le 2026-10-27 — tenant SR vidé, nouvelle plateforme odoo.py. Diagnostic : vert found=1 en continu jusqu'à 07:32 EDT, puis ok=1 found=0 dès 10:23 (removed=1 à la règle des 2 absences) — l'unique offre, un fantôme paru le 2021-08-02, dépubliée entre les deux. Vérification live : API postings SmartRecruiters IngeniuInc 200 totalFound=0 (tenant existant mais vidé), page board 404 ; l'entreprise s'est rebaptisée Ingeniu Solutions (ingeniu.ca → www.ingeniusolutions.com) et publie désormais sur son PROPRE site Odoo (module website_hr_recruitment, /jobs) : 2 offres publiées. Nouvelle classe de plateforme jobka/connectors/odoo.py (pattern glow) : liste HTML rendue serveur (cartes jobs_grid, ancre /jobs/<slug>-<id>, titre <h3>, libellé <address>), pagination /jobs/page/N suivie, détail par MICRODONNÉES schema.org/JobPosting (meta datePosted/employmentType, div itemprop=description) — ⚠️ la div description ne porte que l'intro, le corps (responsabilités, compétences, avantages) vit dans les blocs website-builder qui la suivent : capture jusqu'au footer, CTA retiré ; cache BD + budget de re-visites (JOBKA_ODOO_DETAIL_LIMIT=60), garde-fou anti faux « 0 offre » (marqueur jobs_grid + retry). Lieux en cascade (doctrine bento_sushi, rien d'inventé) : addressLocality structurée → libellé <address> QC → ville citée dans le bloc JobPosting (« à notre bureau de Montréal », « Située à Montréal ») validée contre le référentiel des municipalités QC ; tout ce qui suit <footer> (siège en pied de page) jamais lu. ingeniuinc.py re-pointé sur OdooConnector (ids 743999764601957 → 15/38), sources.json mis à jour (url, careers_url, connector=odoo). Tests réels : fetch isolé 2 offres Montréal (teletravail/hybride, temps_plein, descriptions 2623/3633 car.), sync vert ok=1 found=2 added=2 en 0,3 s (médiane 0.5 — le nouveau board porte réellement 2 offres), 2 offres actives en base, l'ancienne offre SR inactive. 108 tests pytest verts, pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200. Fiches ingeniuinc.md/ats-odoo.md/ats-smartrecruiters.md/INDEX.md régénérées (1132 autres restaurées, hors périmètre).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 27, 2026) parent a0bc5a1 Browse files

7 changed files +545 −243

modified data/sources.json +4 −4
@@ -8963,13 +8963,13 @@
8963 { 8963 {
8964 "id": "ingeniuinc", 8964 "id": "ingeniuinc",
8965 "name": "Ingeniu inc.", 8965 "name": "Ingeniu inc.",
8966− "url": "", 8966+ "url": "https://www.ingeniusolutions.com",
8967− "careers_url": "https://jobs.smartrecruiters.com/company/IngeniuInc", 8967+ "careers_url": "https://www.ingeniusolutions.com/jobs",
8968 "sectors": [ 8968 "sectors": [
8969 "Ingénierie", 8969 "Ingénierie",
8970 "Conseil" 8970 "Conseil"
8971 ], 8971 ],
8972− "connector": "smartrecruiters", 8972+ "connector": "odoo",
8973 "status": "actif", 8973 "status": "actif",
8974 "region": "Montréal" 8974 "region": "Montréal"
8975 }, 8975 },
@@ -13680,4 +13680,4 @@
13680 "region": "Québec (province)" 13680 "region": "Québec (province)"
13681 } 13681 }
13682 ] 13682 ]
13683−}
\ No newline at end of file
13683+}
modified docs/connecteurs/INDEX.md +37 −36
@@ -5,16 +5,16 @@ Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/INDEX.md 6 Fichier : docs/connecteurs/INDEX.md
7 Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt) 7 Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt)
8−Généré : 2026-10-27 13:26 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
12 12
13 # Job·Ka — Connecteurs (index) 13 # Job·Ka — Connecteurs (index)
14 14
15−> Index généré le 2026-10-27 13:26 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`. 15+> Index généré le 2026-10-27 13:42 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`.
16 16
17−**1104 employeurs directs** connectés via **26 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **26174 offres actives** (23120 directes, 3054 portails ; 111 masquées comme doublons inter-sources, soit 26063 visibles). 1135 fiches. 17+**1104 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **26161 offres actives** (23107 directes, 3054 portails ; 111 masquées comme doublons inter-sources, soit 26050 visibles). 1136 fiches.
18 18
19 Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes). 19 Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes).
20 20
@@ -22,17 +22,17 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
22 22
23 | Plateforme | Employeurs | Actives | Salaire | GPS | 23 | Plateforme | Employeurs | Actives | Salaire | GPS |
24 |---|---|---|---|---| 24 |---|---|---|---|---|
25−| [`workday`](ats-workday.md) | 232 | 7510 | 48 % | 87 % | 25+| [`workday`](ats-workday.md) | 232 | 7516 | 48 % | 87 % |
26−| [`smartrecruiters`](ats-smartrecruiters.md) | 172 | 2868 | 16 % | 99 % | 26+| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2865 | 15 % | 99 % |
27−| [`workable`](ats-workable.md) | 71 | 2015 | 18 % | 100 % | 27+| [`workable`](ats-workable.md) | 71 | 2016 | 18 % | 100 % |
28−| [`dayforce`](ats-dayforce.md) | 129 | 1985 | 9 % | 100 % | 28+| [`dayforce`](ats-dayforce.md) | 129 | 1983 | 9 % | 100 % |
29−| [`successfactors`](ats-successfactors.md) | 12 | 1683 | 18 % | 99 % | 29+| [`successfactors`](ats-successfactors.md) | 12 | 1668 | 18 % | 99 % |
30 | [`njoyn`](ats-njoyn.md) | 11 | 1253 | 70 % | 87 % | 30 | [`njoyn`](ats-njoyn.md) | 11 | 1253 | 70 % | 87 % |
31−| [`workland`](ats-workland.md) | 1 | 1154 | 37 % | 100 % | 31+| [`workland`](ats-workland.md) | 1 | 1156 | 36 % | 100 % |
32−| [`greenhouse`](ats-greenhouse.md) | 132 | 814 | 18 % | 99 % | 32+| [`greenhouse`](ats-greenhouse.md) | 132 | 812 | 18 % | 99 % |
33 | [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 807 | 6 % | 100 % | 33 | [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 807 | 6 % | 100 % |
34−| [`lever`](ats-lever.md) | 58 | 611 | 21 % | 95 % | 34+| [`lever`](ats-lever.md) | 58 | 609 | 21 % | 95 % |
35−| [`breezy`](ats-breezy.md) | 71 | 427 | 38 % | 94 % | 35+| [`breezy`](ats-breezy.md) | 71 | 426 | 38 % | 94 % |
36 | [`ashby`](ats-ashby.md) | 41 | 293 | 53 % | 58 % | 36 | [`ashby`](ats-ashby.md) | 41 | 293 | 53 % | 58 % |
37 | [`recruitee`](ats-recruitee.md) | 30 | 285 | 20 % | 97 % | 37 | [`recruitee`](ats-recruitee.md) | 30 | 285 | 20 % | 97 % |
38 | [`bamboohr`](ats-bamboohr.md) | 37 | 278 | 8 % | 100 % | 38 | [`bamboohr`](ats-bamboohr.md) | 37 | 278 | 8 % | 100 % |
@@ -40,14 +40,15 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
40 | [`teamtailor`](ats-teamtailor.md) | 10 | 158 | 28 % | 96 % | 40 | [`teamtailor`](ats-teamtailor.md) | 10 | 158 | 28 % | 96 % |
41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 145 | 14 % | 86 % | 41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 145 | 14 % | 86 % |
42 | [`jazzhr`](ats-jazzhr.md) | 28 | 141 | 17 % | 91 % | 42 | [`jazzhr`](ats-jazzhr.md) | 28 | 141 | 17 % | 91 % |
43−| [`adp`](ats-adp.md) | 17 | 133 | 36 % | 95 % | 43+| [`adp`](ats-adp.md) | 17 | 134 | 37 % | 94 % |
44 | [`taleo`](ats-taleo.md) | 5 | 107 | 0 % | 100 % | 44 | [`taleo`](ats-taleo.md) | 5 | 107 | 0 % | 100 % |
45−| [`eightfold`](ats-eightfold.md) | 1 | 55 | 89 % | 98 % | 45+| [`eightfold`](ats-eightfold.md) | 1 | 55 | 89 % | 96 % |
46 | [`icims`](ats-icims.md) | 7 | 53 | 28 % | 96 % | 46 | [`icims`](ats-icims.md) | 7 | 53 | 28 % | 96 % |
47 | [`ultipro`](ats-ultipro.md) | 4 | 48 | 52 % | 100 % | 47 | [`ultipro`](ats-ultipro.md) | 4 | 48 | 52 % | 100 % |
48 | [`digitalrecruiters`](ats-digitalrecruiters.md) | 2 | 36 | 83 % | 100 % | 48 | [`digitalrecruiters`](ats-digitalrecruiters.md) | 2 | 36 | 83 % | 100 % |
49 | [`custom`](ats-custom.md) | 1 | 32 | 38 % | 91 % | 49 | [`custom`](ats-custom.md) | 1 | 32 | 38 % | 91 % |
50 | [`glow`](ats-glow.md) | 1 | 9 | 44 % | 0 % | 50 | [`glow`](ats-glow.md) | 1 | 9 | 44 % | 0 % |
51+| [`odoo`](ats-odoo.md) | 1 | 2 | 0 % | 0 % |
51 52
52 ## Portails agrégateurs & dépôt 53 ## Portails agrégateurs & dépôt
53 54
@@ -62,10 +63,10 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
62 63
63 | Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK | 64 | Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK |
64 |---|---|---|---|---|---| 65 |---|---|---|---|---|---|
65−| [Réseau Atlas Workland (~80 employeurs QC : CSS, cégeps, Santé Québec, STQ, UQTR…)](atlas_workland.md) | [`workland`](ats-workland.md) | 1154 | 37 % | 100 % | ✅ | 66+| [Réseau Atlas Workland (~80 employeurs QC : CSS, cégeps, Santé Québec, STQ, UQTR…)](atlas_workland.md) | [`workland`](ats-workland.md) | 1156 | 36 % | 100 % | ✅ |
66 | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 1003 | 70 % | 68 % | ✅ | 67 | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 1003 | 70 % | 68 % | ✅ |
67 | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 969 | 25 % | 100 % | ✅ | 68 | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 969 | 25 % | 100 % | ✅ |
68−| [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 941 | 1 % | 100 % | ✅ | 69+| [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 929 | 1 % | 100 % | ✅ |
69 | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 917 | 98 % | 89 % | ✅ | 70 | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 917 | 98 % | 89 % | ✅ |
70 | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 818 | 98 % | 98 % | ✅ | 71 | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 818 | 98 % | 98 % | ✅ |
71 | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 431 | 82 % | 99 % | ✅ | 72 | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 431 | 82 % | 99 % | ✅ |
@@ -75,12 +76,12 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
75 | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 263 | 17 % | 96 % | ✅ | 76 | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 263 | 17 % | 96 % | ✅ |
76 | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 263 | 10 % | 95 % | ✅ | 77 | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 263 | 10 % | 95 % | ✅ |
77 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 260 | 1 % | 100 % | ✅ | 78 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 260 | 1 % | 100 % | ✅ |
78−| [Alstom](alstom.md) | [`successfactors`](ats-successfactors.md) | 248 | 8 % | 100 % | ✅ | 79+| [Alstom](alstom.md) | [`successfactors`](ats-successfactors.md) | 247 | 8 % | 100 % | ✅ |
79 | [Rechercher des](gianttiger.md) | [`workday`](ats-workday.md) | 239 | 0 % | 100 % | ✅ | 80 | [Rechercher des](gianttiger.md) | [`workday`](ats-workday.md) | 239 | 0 % | 100 % | ✅ |
80 | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 234 | 0 % | 83 % | ✅ | 81 | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 234 | 0 % | 83 % | ✅ |
81 | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 209 | 4 % | 98 % | ✅ | 82 | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 209 | 4 % | 98 % | ✅ |
82 | [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 208 | 18 % | 100 % | ✅ | 83 | [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 208 | 18 % | 100 % | ✅ |
83−| [American Iron and Metal](americanironandmetal.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 199 | 21 % | 100 % | ✅ | 84+| [American Iron and Metal](americanironandmetal.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 201 | 20 % | 100 % | ✅ |
84 | [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 199 | 94 % | 96 % | ✅ | 85 | [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 199 | 94 % | 96 % | ✅ |
85 | [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 179 | 3 % | 100 % | ✅ | 86 | [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 179 | 3 % | 100 % | ✅ |
86 | [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 164 | 4 % | 100 % | ✅ | 87 | [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 164 | 4 % | 100 % | ✅ |
@@ -93,7 +94,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
93 | [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 130 | 6 % | 100 % | ✅ | 94 | [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 130 | 6 % | 100 % | ✅ |
94 | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 127 | 98 % | 100 % | ✅ | 95 | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 127 | 98 % | 100 % | ✅ |
95 | [TJX Canada (Winners, HomeSense, Marshalls)](tjx.md) | [`workday`](ats-workday.md) | 115 | 98 % | 100 % | ✅ | 96 | [TJX Canada (Winners, HomeSense, Marshalls)](tjx.md) | [`workday`](ats-workday.md) | 115 | 98 % | 100 % | ✅ |
96−| [Cascades](cascades.md) | [`successfactors`](ats-successfactors.md) | 112 | 83 % | 98 % | ✅ | 97+| [Cascades](cascades.md) | [`successfactors`](ats-successfactors.md) | 110 | 83 % | 98 % | ✅ |
97 | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 106 | 0 % | 100 % | ✅ | 98 | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 106 | 0 % | 100 % | ✅ |
98 | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 105 | 15 % | 100 % | ✅ | 99 | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 105 | 15 % | 100 % | ✅ |
99 | [Groupe Helios](groupehelios.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 105 | 2 % | 100 % | ✅ | 100 | [Groupe Helios](groupehelios.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 105 | 2 % | 100 % | ✅ |
@@ -101,7 +102,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
101 | [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 102 | 7 % | 100 % | ✅ | 102 | [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 102 | 7 % | 100 % | ✅ |
102 | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 100 | 9 % | 100 % | ✅ | 103 | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 100 | 9 % | 100 % | ✅ |
103 | [CISSS de Chaudière-Appalaches](cisss_chaudiere_appalaches.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 99 | 3 % | 99 % | ✅ | 104 | [CISSS de Chaudière-Appalaches](cisss_chaudiere_appalaches.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 99 | 3 % | 99 % | ✅ |
104−| [BMO Groupe financier](bmo.md) | [`workday`](ats-workday.md) | 95 | 86 % | 81 % | ✅ | 105+| [BMO Groupe financier](bmo.md) | [`workday`](ats-workday.md) | 96 | 86 % | 80 % | ✅ |
105 | [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 95 | 1 % | 81 % | ✅ | 106 | [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 95 | 1 % | 81 % | ✅ |
106 | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 94 | 0 % | 99 % | ✅ | 107 | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 94 | 0 % | 99 % | ✅ |
107 | [iA Groupe financier](ia_groupe.md) | [`workday`](ats-workday.md) | 94 | 100 % | 94 % | ✅ | 108 | [iA Groupe financier](ia_groupe.md) | [`workday`](ats-workday.md) | 94 | 100 % | 94 % | ✅ |
@@ -111,9 +112,9 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
111 | [Linen Chest](linenchest.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 84 | 8 % | 100 % | ✅ | 112 | [Linen Chest](linenchest.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 84 | 8 % | 100 % | ✅ |
112 | [Gflenv](gflenv.md) | [`workday`](ats-workday.md) | 83 | 5 % | 84 % | ✅ | 113 | [Gflenv](gflenv.md) | [`workday`](ats-workday.md) | 83 | 5 % | 84 % | ✅ |
113 | [Renaud-Bray](renaud_bray.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 82 | 1 % | 100 % | ✅ | 114 | [Renaud-Bray](renaud_bray.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 82 | 1 % | 100 % | ✅ |
114−| [Bulkbarn](bulkbarn.md) | [`dayforce`](ats-dayforce.md) | 81 | 0 % | 100 % | ✅ | 115+| [Bulkbarn](bulkbarn.md) | [`dayforce`](ats-dayforce.md) | 80 | 0 % | 100 % | ✅ |
115 | [CISSS de l'Outaouais](cisss_outaouais.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 79 | 30 % | 100 % | ✅ | 116 | [CISSS de l'Outaouais](cisss_outaouais.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 79 | 30 % | 100 % | ✅ |
116−| [CAE](cae.md) | [`workday`](ats-workday.md) | 77 | 16 % | 95 % | ✅ | 117+| [CAE](cae.md) | [`workday`](ats-workday.md) | 78 | 15 % | 94 % | ✅ |
117 | [MaintainX](maintainx.md) | [`ashby`](ats-ashby.md) | 70 | 93 % | 76 % | ✅ | 118 | [MaintainX](maintainx.md) | [`ashby`](ats-ashby.md) | 70 | 93 % | 76 % | ✅ |
118 | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 67 | 0 % | 97 % | ✅ | 119 | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 67 | 0 % | 97 % | ✅ |
119 | [Laporte Experts Conseils](laportefr.md) | [`greenhouse`](ats-greenhouse.md) | 65 | 0 % | 94 % | ✅ | 120 | [Laporte Experts Conseils](laportefr.md) | [`greenhouse`](ats-greenhouse.md) | 65 | 0 % | 94 % | ✅ |
@@ -134,7 +135,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
134 | [Agropur](agropur.md) | [`workday`](ats-workday.md) | 57 | 95 % | 96 % | ✅ | 135 | [Agropur](agropur.md) | [`workday`](ats-workday.md) | 57 | 95 % | 96 % | ✅ |
135 | [Automobileendirect](automobileendirect.md) | [`dayforce`](ats-dayforce.md) | 57 | 2 % | 100 % | ✅ | 136 | [Automobileendirect](automobileendirect.md) | [`dayforce`](ats-dayforce.md) | 57 | 2 % | 100 % | ✅ |
136 | [Galderma](galderma.md) | [`workday`](ats-workday.md) | 56 | 0 % | 100 % | ✅ | 137 | [Galderma](galderma.md) | [`workday`](ats-workday.md) | 56 | 0 % | 100 % | ✅ |
137−| [Autodesk](autodesk.md) | [`eightfold`](ats-eightfold.md) | 55 | 89 % | 98 % | ✅ | 138+| [Autodesk](autodesk.md) | [`eightfold`](ats-eightfold.md) | 55 | 89 % | 96 % | ✅ |
138 | [Agnico Eagle Mines](agnico_eagle.md) | [`taleo`](ats-taleo.md) | 54 | 0 % | 100 % | ✅ | 139 | [Agnico Eagle Mines](agnico_eagle.md) | [`taleo`](ats-taleo.md) | 54 | 0 % | 100 % | ✅ |
139 | [Kruger](kruger.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 53 | 9 % | 100 % | ✅ | 140 | [Kruger](kruger.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 53 | 9 % | 100 % | ✅ |
140 | [Squarepoint Capital](squarepointcapital.md) | [`greenhouse`](ats-greenhouse.md) | 53 | 38 % | 100 % | ✅ | 141 | [Squarepoint Capital](squarepointcapital.md) | [`greenhouse`](ats-greenhouse.md) | 53 | 38 % | 100 % | ✅ |
@@ -155,18 +156,19 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
155 | [Unoria](unoria.md) | [`dayforce`](ats-dayforce.md) | 45 | 0 % | 100 % | ✅ | 156 | [Unoria](unoria.md) | [`dayforce`](ats-dayforce.md) | 45 | 0 % | 100 % | ✅ |
156 | [Alterra](alterra.md) | [`workday`](ats-workday.md) | 44 | 68 % | 98 % | ✅ | 157 | [Alterra](alterra.md) | [`workday`](ats-workday.md) | 44 | 68 % | 98 % | ✅ |
157 | [Bdo](bdo.md) | [`workday`](ats-workday.md) | 44 | 7 % | 70 % | ✅ | 158 | [Bdo](bdo.md) | [`workday`](ats-workday.md) | 44 | 7 % | 70 % | ✅ |
159+| [Beneva](beneva.md) | [`workday`](ats-workday.md) | 44 | 2 % | 100 % | ✅ |
158 | [Cogeco](cogeco.md) | [`workday`](ats-workday.md) | 44 | 18 % | 45 % | ✅ | 160 | [Cogeco](cogeco.md) | [`workday`](ats-workday.md) | 44 | 18 % | 45 % | ✅ |
159−| [Beneva](beneva.md) | [`workday`](ats-workday.md) | 43 | 2 % | 100 % | ✅ |
160−| [Brand Momentum](brandmomentum.md) | [`breezy`](ats-breezy.md) | 43 | 95 % | 95 % | ✅ |
161 | [Camions Excellence Peterbilt](excellencepeterbilt.md) | [`dayforce`](ats-dayforce.md) | 43 | 37 % | 100 % | ✅ | 161 | [Camions Excellence Peterbilt](excellencepeterbilt.md) | [`dayforce`](ats-dayforce.md) | 43 | 37 % | 100 % | ✅ |
162 | [JD Sports Canada](jdsports.md) | [`dayforce`](ats-dayforce.md) | 43 | 0 % | 100 % | ✅ | 162 | [JD Sports Canada](jdsports.md) | [`dayforce`](ats-dayforce.md) | 43 | 0 % | 100 % | ✅ |
163 | [Levio](levio.md) | [`greenhouse`](ats-greenhouse.md) | 43 | 0 % | 100 % | ✅ | 163 | [Levio](levio.md) | [`greenhouse`](ats-greenhouse.md) | 43 | 0 % | 100 % | ✅ |
164 | [Rio Tinto](riotinto.md) | [`workday`](ats-workday.md) | 43 | 0 % | 98 % | ✅ | 164 | [Rio Tinto](riotinto.md) | [`workday`](ats-workday.md) | 43 | 0 % | 98 % | ✅ |
165 | [Saputo](saputo.md) | [`workday`](ats-workday.md) | 43 | 81 % | 100 % | ✅ | 165 | [Saputo](saputo.md) | [`workday`](ats-workday.md) | 43 | 81 % | 100 % | ✅ |
166+| [Brand Momentum](brandmomentum.md) | [`breezy`](ats-breezy.md) | 42 | 95 % | 95 % | ✅ |
166 | [Investissements PSP](investpsp.md) | [`workday`](ats-workday.md) | 42 | 2 % | 100 % | ✅ | 167 | [Investissements PSP](investpsp.md) | [`workday`](ats-workday.md) | 42 | 2 % | 100 % | ✅ |
167 | [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 42 | 7 % | 100 % | ✅ | 168 | [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 42 | 7 % | 100 % | ✅ |
168 | [Groupe CH (Canadiens de Montréal, Centre Bell)](groupech.md) | [`dayforce`](ats-dayforce.md) | 41 | 0 % | 100 % | ✅ | 169 | [Groupe CH (Canadiens de Montréal, Centre Bell)](groupech.md) | [`dayforce`](ats-dayforce.md) | 41 | 0 % | 100 % | ✅ |
169 | [Info-Ways](info_ways.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 39 | 0 % | 100 % | ✅ | 170 | [Info-Ways](info_ways.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 39 | 0 % | 100 % | ✅ |
171+| [CDPQ — Caisse de dépôt et placement du Québec](cdpq.md) | [`workday`](ats-workday.md) | 38 | 0 % | 95 % | ✅ |
170 | [Cohere](cohere.md) | [`ashby`](ats-ashby.md) | 38 | 92 % | 26 % | ✅ | 172 | [Cohere](cohere.md) | [`ashby`](ats-ashby.md) | 38 | 92 % | 26 % | ✅ |
171 | [exo (transport métropolitain)](exo.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 38 | 0 % | 89 % | ✅ | 173 | [exo (transport métropolitain)](exo.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 38 | 0 % | 89 % | ✅ |
172 | [Sapsol Technologies Inc](sapsol_technologies_inc_7.md) | [`workable`](ats-workable.md) | 38 | 0 % | 100 % | ✅ | 174 | [Sapsol Technologies Inc](sapsol_technologies_inc_7.md) | [`workable`](ats-workable.md) | 38 | 0 % | 100 % | ✅ |
@@ -177,13 +179,12 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
177 | [Kenworthmaska](kenworthmaska.md) | [`dayforce`](ats-dayforce.md) | 37 | 3 % | 100 % | ✅ | 179 | [Kenworthmaska](kenworthmaska.md) | [`dayforce`](ats-dayforce.md) | 37 | 3 % | 100 % | ✅ |
178 | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 37 | 5 % | 97 % | ✅ | 180 | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 37 | 5 % | 97 % | ✅ |
179 | [Uhaul](uhaul.md) | [`workday`](ats-workday.md) | 37 | 0 % | 100 % | ✅ | 181 | [Uhaul](uhaul.md) | [`workday`](ats-workday.md) | 37 | 0 % | 100 % | ✅ |
180−| [CDPQ — Caisse de dépôt et placement du Québec](cdpq.md) | [`workday`](ats-workday.md) | 36 | 0 % | 100 % | ✅ |
181 | [EXFO](exfo.md) | [`workday`](ats-workday.md) | 35 | 0 % | 97 % | ✅ | 182 | [EXFO](exfo.md) | [`workday`](ats-workday.md) | 35 | 0 % | 97 % | ✅ |
183+| [Abinbev](abinbev.md) | [`workday`](ats-workday.md) | 34 | 100 % | 97 % | ✅ |
182 | [KABS](kabs.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 0 % | 100 % | ✅ | 184 | [KABS](kabs.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 0 % | 100 % | ✅ |
183 | [OPENLANE Canada](openlane.md) | [`workday`](ats-workday.md) | 34 | 21 % | 88 % | ✅ | 185 | [OPENLANE Canada](openlane.md) | [`workday`](ats-workday.md) | 34 | 21 % | 88 % | ✅ |
184 | [QSL](qsl.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 29 % | 100 % | ✅ | 186 | [QSL](qsl.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 29 % | 100 % | ✅ |
185 | [Rollsroyce](rollsroyce.md) | [`workday`](ats-workday.md) | 34 | 0 % | 100 % | ✅ | 187 | [Rollsroyce](rollsroyce.md) | [`workday`](ats-workday.md) | 34 | 0 % | 100 % | ✅ |
186−| [Abinbev](abinbev.md) | [`workday`](ats-workday.md) | 33 | 100 % | 100 % | ✅ |
187 | [Advanceauto](advanceauto.md) | [`workday`](ats-workday.md) | 33 | 0 % | 36 % | ✅ | 188 | [Advanceauto](advanceauto.md) | [`workday`](ats-workday.md) | 33 | 0 % | 36 % | ✅ |
188 | [Domtar](domtar.md) | [`successfactors`](ats-successfactors.md) | 33 | 12 % | 100 % | ✅ | 189 | [Domtar](domtar.md) | [`successfactors`](ats-successfactors.md) | 33 | 12 % | 100 % | ✅ |
189 | [Imperial Brady Canada](imperialdade.md) | [`dayforce`](ats-dayforce.md) | 33 | 0 % | 100 % | ✅ | 190 | [Imperial Brady Canada](imperialdade.md) | [`dayforce`](ats-dayforce.md) | 33 | 0 % | 100 % | ✅ |
@@ -202,10 +203,8 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
202 | [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 29 | 0 % | 100 % | ✅ | 203 | [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 29 | 0 % | 100 % | ✅ |
203 | [Lgs](lgs.md) | [`dayforce`](ats-dayforce.md) | 29 | 0 % | 100 % | ✅ | 204 | [Lgs](lgs.md) | [`dayforce`](ats-dayforce.md) | 29 | 0 % | 100 % | ✅ |
204 | [Service alimentaire Gordon](gfs.md) | [`workday`](ats-workday.md) | 29 | 66 % | 97 % | ✅ | 205 | [Service alimentaire Gordon](gfs.md) | [`workday`](ats-workday.md) | 29 | 66 % | 97 % | ✅ |
205−| [AccorHotel](accorhotel.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 28 | 57 % | 100 % | ✅ |
206 | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 28 | 0 % | 36 % | ✅ | 206 | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 28 | 0 % | 36 % | ✅ |
207 | [Ms](ms.md) | [`workday`](ats-workday.md) | 28 | 0 % | 100 % | ✅ | 207 | [Ms](ms.md) | [`workday`](ats-workday.md) | 28 | 0 % | 100 % | ✅ |
208−| [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 27 | 0 % | 100 % | ✅ |
209 | [Rodeo FX](rodeofx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 93 % | ✅ | 208 | [Rodeo FX](rodeofx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 93 % | ✅ |
210 | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 100 % | ✅ | 209 | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 100 % | ✅ |
211 | [The Children's Place](childrensplace.md) | [`workday`](ats-workday.md) | 27 | 0 % | 22 % | ✅ | 210 | [The Children's Place](childrensplace.md) | [`workday`](ats-workday.md) | 27 | 0 % | 22 % | ✅ |
@@ -219,6 +218,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
219 | [RM Staffing B.V.](rebootmonkey.md) | [`recruitee`](ats-recruitee.md) | 26 | 85 % | 100 % | ✅ | 218 | [RM Staffing B.V.](rebootmonkey.md) | [`recruitee`](ats-recruitee.md) | 26 | 85 % | 100 % | ✅ |
220 | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 92 % | ✅ | 219 | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 92 % | ✅ |
221 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 25 | 100 % | 0 % | ✅ | 220 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 25 | 100 % | 0 % | ✅ |
221+| [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 25 | 0 % | 100 % | ✅ |
222 | [Clinical Research Associate](syneoshealth.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ | 222 | [Clinical Research Associate](syneoshealth.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ |
223 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ | 223 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ |
224 | [Wabtec](wabtec.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 25 | 16 % | 100 % | ✅ | 224 | [Wabtec](wabtec.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 25 | 16 % | 100 % | ✅ |
@@ -240,6 +240,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
240 | [Soprema](soprema.md) | [`dayforce`](ats-dayforce.md) | 23 | 13 % | 100 % | ✅ | 240 | [Soprema](soprema.md) | [`dayforce`](ats-dayforce.md) | 23 | 13 % | 100 % | ✅ |
241 | [Tmx](tmx.md) | [`workday`](ats-workday.md) | 23 | 0 % | 83 % | ✅ | 241 | [Tmx](tmx.md) | [`workday`](ats-workday.md) | 23 | 0 % | 83 % | ✅ |
242 | [Transat A.T.](transatat1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ | 242 | [Transat A.T.](transatat1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ |
243+| [AccorHotel](accorhotel.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 22 | 50 % | 100 % | ✅ |
243 | [Baro RH](barorh.md) | [`workable`](ats-workable.md) | 22 | 0 % | 100 % | ✅ | 244 | [Baro RH](barorh.md) | [`workable`](ats-workable.md) | 22 | 0 % | 100 % | ✅ |
244 | [Canada Vie](canada_vie.md) | [`successfactors`](ats-successfactors.md) | 22 | 95 % | 86 % | ✅ | 245 | [Canada Vie](canada_vie.md) | [`successfactors`](ats-successfactors.md) | 22 | 95 % | 86 % | ✅ |
245 | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 22 | 86 % | 100 % | ✅ | 246 | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 22 | 86 % | 100 % | ✅ |
@@ -517,7 +518,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
517 | [Altitude Sports](altitude_sports.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 7 | 14 % | 100 % | ✅ | 518 | [Altitude Sports](altitude_sports.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 7 | 14 % | 100 % | ✅ |
518 | [Alveole](alveole.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 100 % | 100 % | ✅ | 519 | [Alveole](alveole.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 100 % | 100 % | ✅ |
519 | [Artefact North America](artefactnoram.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 57 % | 100 % | ✅ | 520 | [Artefact North America](artefactnoram.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 57 % | 100 % | ✅ |
520−| [Bain Magique](bainmagique.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 57 % | 100 % | ✅ |
521 | [Big Bang](bigbang.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 29 % | 100 % | ✅ | 521 | [Big Bang](bigbang.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 29 % | 100 % | ✅ |
522 | [Boart Longyear](bly.md) | [`dayforce`](ats-dayforce.md) | 7 | 100 % | 100 % | ✅ | 522 | [Boart Longyear](bly.md) | [`dayforce`](ats-dayforce.md) | 7 | 100 % | 100 % | ✅ |
523 | [Carrier](carrier.md) | [`workday`](ats-workday.md) | 7 | 86 % | 43 % | ✅ | 523 | [Carrier](carrier.md) | [`workday`](ats-workday.md) | 7 | 86 % | 43 % | ✅ |
@@ -549,11 +549,13 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
549 | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ | 549 | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ |
550 | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 7 | 14 % | 100 % | ✅ | 550 | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 7 | 14 % | 100 % | ✅ |
551 | [Trigyn Technologies](trigyntechnologies1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 0 % | 100 % | ✅ | 551 | [Trigyn Technologies](trigyntechnologies1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 0 % | 100 % | ✅ |
552+| [Abritek](abritek.md) | [`adp`](ats-adp.md) | 6 | 100 % | 83 % | ✅ |
552 | [Accedian Networks](accediannetworks.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | 553 | [Accedian Networks](accediannetworks.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
553 | [Alimentiv](alimentiv_2.md) | [`lever`](ats-lever.md) | 6 | 100 % | 0 % | ✅ | 554 | [Alimentiv](alimentiv_2.md) | [`lever`](ats-lever.md) | 6 | 100 % | 0 % | ✅ |
554 | [Alo Yoga](aloyoga.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 50 % | 67 % | ✅ | 555 | [Alo Yoga](aloyoga.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 50 % | 67 % | ✅ |
555 | [Also Recrutement - Carrière](alsorecrutement.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 17 % | 50 % | ✅ | 556 | [Also Recrutement - Carrière](alsorecrutement.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 17 % | 50 % | ✅ |
556 | [Altitude Aerospace](altitudeaerospace.md) | [`jazzhr`](ats-jazzhr.md) | 6 | 0 % | 100 % | ✅ | 557 | [Altitude Aerospace](altitudeaerospace.md) | [`jazzhr`](ats-jazzhr.md) | 6 | 0 % | 100 % | ✅ |
558+| [Bain Magique](bainmagique.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 67 % | 100 % | ✅ |
557 | [Bdx](bdx.md) | [`workday`](ats-workday.md) | 6 | 17 % | 83 % | ✅ | 559 | [Bdx](bdx.md) | [`workday`](ats-workday.md) | 6 | 17 % | 83 % | ✅ |
558 | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | 560 | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ |
559 | [Board](deltastar.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | 561 | [Board](deltastar.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ |
@@ -581,6 +583,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
581 | [MSI Gestion immobilière](msi_gestion.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ | 583 | [MSI Gestion immobilière](msi_gestion.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ |
582 | [Nexapp](nexapp.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | 584 | [Nexapp](nexapp.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
583 | [Nomic Bio](nomic.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 83 % | ✅ | 585 | [Nomic Bio](nomic.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 83 % | ✅ |
586+| [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 6 | 17 % | 83 % | ✅ |
584 | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ | 587 | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ |
585 | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | 588 | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
586 | [Place et Forme inc](placeetforme.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 50 % | 50 % | ✅ | 589 | [Place et Forme inc](placeetforme.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 50 % | 50 % | ✅ |
@@ -594,7 +597,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
594 | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ | 597 | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ |
595 | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | 598 | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
596 | [36Pix](pix36.md) | [`jazzhr`](ats-jazzhr.md) | 5 | 20 % | 100 % | ✅ | 599 | [36Pix](pix36.md) | [`jazzhr`](ats-jazzhr.md) | 5 | 20 % | 100 % | ✅ |
597−| [Abritek](abritek.md) | [`adp`](ats-adp.md) | 5 | 100 % | 100 % | ✅ |
598 | [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ | 600 | [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ |
599 | [Agile DSS](agiledss.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ | 601 | [Agile DSS](agiledss.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ |
600 | [Aleanza Recrutement Durable](aleanzarecrutementdurable.md) | [`teamtailor`](ats-teamtailor.md) | 5 | 40 % | 100 % | ✅ | 602 | [Aleanza Recrutement Durable](aleanzarecrutementdurable.md) | [`teamtailor`](ats-teamtailor.md) | 5 | 40 % | 100 % | ✅ |
@@ -613,7 +615,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
613 | [Ecosystem Énergie](ecosystem.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | 615 | [Ecosystem Énergie](ecosystem.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ |
614 | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ | 616 | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ |
615 | [Fccfac](fccfac.md) | [`workday`](ats-workday.md) | 5 | 80 % | 20 % | ✅ | 617 | [Fccfac](fccfac.md) | [`workday`](ats-workday.md) | 5 | 80 % | 20 % | ✅ |
616−| [FOREMAN ASSISTANT SHIPPING RECEIVING](benmor.md) | [`dayforce`](ats-dayforce.md) | 5 | 40 % | 100 % | ✅ |
617 | [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ | 618 | [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ |
618 | [Ggi](ggi.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ | 619 | [Ggi](ggi.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ |
619 | [GoMaterials](gomaterials.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | 620 | [GoMaterials](gomaterials.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ |
@@ -633,7 +634,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
633 | [MVV](mvv1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 5 | 0 % | 100 % | ✅ | 634 | [MVV](mvv1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 5 | 0 % | 100 % | ✅ |
634 | [Médialo](medialo.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 80 % | ✅ | 635 | [Médialo](medialo.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 80 % | ✅ |
635 | [Nrfcanada](nrfcanada.md) | [`workday`](ats-workday.md) | 5 | 40 % | 60 % | ✅ | 636 | [Nrfcanada](nrfcanada.md) | [`workday`](ats-workday.md) | 5 | 40 % | 60 % | ✅ |
636−| [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 5 | 20 % | 100 % | ✅ |
637 | [Omni Hôtel Mont-Royal](omni_hotels_gestion.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ | 637 | [Omni Hôtel Mont-Royal](omni_hotels_gestion.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ |
638 | [Omni Hôtel Mont-Royal](omni_hotels_horaire.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ | 638 | [Omni Hôtel Mont-Royal](omni_hotels_horaire.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ |
639 | [Pfizer Canada](pfizer.md) | [`workday`](ats-workday.md) | 5 | 100 % | 0 % | ✅ | 639 | [Pfizer Canada](pfizer.md) | [`workday`](ats-workday.md) | 5 | 100 % | 0 % | ✅ |
@@ -652,7 +652,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
652 | [AutoTrader Canada](autotradercanada.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 100 % | 100 % | ✅ | 652 | [AutoTrader Canada](autotradercanada.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 100 % | 100 % | ✅ |
653 | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 4 | 0 % | 100 % | ✅ | 653 | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 4 | 0 % | 100 % | ✅ |
654 | [Avocat en immigration d'affaires américaine](fragomen.md) | [`workday`](ats-workday.md) | 4 | 0 % | 100 % | ✅ | 654 | [Avocat en immigration d'affaires américaine](fragomen.md) | [`workday`](ats-workday.md) | 4 | 0 % | 100 % | ✅ |
655−| [Bath Fitter Corporate](bathfitterdistributinginc.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 50 % | 100 % | ✅ |
656 | [Boreala Management](borealamanagement.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 655 | [Boreala Management](borealamanagement.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
657 | [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 4 | 0 % | 100 % | ✅ | 656 | [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 4 | 0 % | 100 % | ✅ |
658 | [Chanel](cc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ✅ | 657 | [Chanel](cc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ✅ |
@@ -670,6 +669,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
670 | [Fellow Insights Inc.](fellowai.md) | [`ashby`](ats-ashby.md) | 4 | 0 % | 0 % | ✅ | 669 | [Fellow Insights Inc.](fellowai.md) | [`ashby`](ats-ashby.md) | 4 | 0 % | 0 % | ✅ |
671 | [Flatgigs](flatgigs.md) | [`workable`](ats-workable.md) | 4 | 0 % | 100 % | ✅ | 670 | [Flatgigs](flatgigs.md) | [`workable`](ats-workable.md) | 4 | 0 % | 100 % | ✅ |
672 | [Flowcontrol](flowcontrol.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | 671 | [Flowcontrol](flowcontrol.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ |
672+| [FOREMAN ASSISTANT SHIPPING RECEIVING](benmor.md) | [`dayforce`](ats-dayforce.md) | 4 | 25 % | 100 % | ✅ |
673 | [Fortigo Freight Services Inc.](fortigofreightservicesinc.md) | [`jazzhr`](ats-jazzhr.md) | 4 | 25 % | 50 % | ✅ | 673 | [Fortigo Freight Services Inc.](fortigofreightservicesinc.md) | [`jazzhr`](ats-jazzhr.md) | 4 | 25 % | 50 % | ✅ |
674 | [GAME DESIGN AND VIDEO GAME LEVEL](lci.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | 674 | [GAME DESIGN AND VIDEO GAME LEVEL](lci.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ |
675 | [Gategroup](gategroup.md) | [`workday`](ats-workday.md) | 4 | 50 % | 75 % | ✅ | 675 | [Gategroup](gategroup.md) | [`workday`](ats-workday.md) | 4 | 50 % | 75 % | ✅ |
@@ -693,6 +693,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
693 | [Nmédia](nmdia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 693 | [Nmédia](nmdia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
694 | [Norbert Health](norbert_health.md) | [`breezy`](ats-breezy.md) | 4 | 0 % | 100 % | ✅ | 694 | [Norbert Health](norbert_health.md) | [`breezy`](ats-breezy.md) | 4 | 0 % | 100 % | ✅ |
695 | [Nssl](nssl.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | 695 | [Nssl](nssl.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ |
696+| [O-I](o_i.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 50 % | 100 % | ✅ |
696 | [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 697 | [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
697 | [Outpost VFX](outpostvfx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 698 | [Outpost VFX](outpostvfx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
698 | [Pivot + Edge](pivotandedge.md) | [`recruitee`](ats-recruitee.md) | 4 | 0 % | 100 % | ✅ | 699 | [Pivot + Edge](pivotandedge.md) | [`recruitee`](ats-recruitee.md) | 4 | 0 % | 100 % | ✅ |
@@ -721,6 +722,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
721 | [AON3D](aon3d_fr.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | 722 | [AON3D](aon3d_fr.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ |
722 | [AstenJohnson](ajholdingsltd.md) | [`dayforce`](ats-dayforce.md) | 3 | 100 % | 100 % | ✅ | 723 | [AstenJohnson](ajholdingsltd.md) | [`dayforce`](ats-dayforce.md) | 3 | 100 % | 100 % | ✅ |
723 | [Autorité des marchés financiers (AMF)](lautorite.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ | 724 | [Autorité des marchés financiers (AMF)](lautorite.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ |
725+| [Bath Fitter Corporate](bathfitterdistributinginc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 67 % | 100 % | ✅ |
724 | [BDC](bdc.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ | 726 | [BDC](bdc.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ |
725 | [BETA Technologies](betatechnologiesinc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 67 % | 100 % | ✅ | 727 | [BETA Technologies](betatechnologiesinc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 67 % | 100 % | ✅ |
726 | [Bilingual Fire Protection Sales Representative](victaulic.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ | 728 | [Bilingual Fire Protection Sales Representative](victaulic.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ |
@@ -767,7 +769,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
767 | [Modern Menopause](modernmenopause.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | 769 | [Modern Menopause](modernmenopause.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ |
768 | [MXO](mxo.md) | [`bamboohr`](ats-bamboohr.md) | 3 | 67 % | 100 % | ✅ | 770 | [MXO](mxo.md) | [`bamboohr`](ats-bamboohr.md) | 3 | 67 % | 100 % | ✅ |
769 | [Naisense Solutions Inc](naisensesolutionsinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 0 % | 100 % | ✅ | 771 | [Naisense Solutions Inc](naisensesolutionsinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 0 % | 100 % | ✅ |
770−| [O-I](o_i.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 33 % | 100 % | ✅ |
771 | [Oboxmedia](oboxmedia1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 0 % | 100 % | ✅ | 772 | [Oboxmedia](oboxmedia1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 0 % | 100 % | ✅ |
772 | [Opportunities with AppDirect's Advisor Partners (Recruitment as a Service)](appdirectraas.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | 773 | [Opportunities with AppDirect's Advisor Partners (Recruitment as a Service)](appdirectraas.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ |
773 | [Paradox](paradox.md) | [`ashby`](ats-ashby.md) | 3 | 0 % | 0 % | ✅ | 774 | [Paradox](paradox.md) | [`ashby`](ats-ashby.md) | 3 | 0 % | 0 % | ✅ |
@@ -836,6 +837,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
836 | [Granit Design](granit_design.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ | 837 | [Granit Design](granit_design.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ |
837 | [Groupe BC2](bc2.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ | 838 | [Groupe BC2](bc2.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ |
838 | [HP](hp.md) | [`workday`](ats-workday.md) | 2 | 100 % | 100 % | ✅ | 839 | [HP](hp.md) | [`workday`](ats-workday.md) | 2 | 100 % | 100 % | ✅ |
840+| [Ingeniu inc.](ingeniuinc.md) | [`odoo`](ats-odoo.md) | 2 | 0 % | 0 % | ✅ |
839 | [Jj](jj.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ | 841 | [Jj](jj.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ |
840 | [Kiongroup](kiongroup.md) | [`workday`](ats-workday.md) | 2 | 50 % | 50 % | ✅ | 842 | [Kiongroup](kiongroup.md) | [`workday`](ats-workday.md) | 2 | 50 % | 50 % | ✅ |
841 | [Kodify Media Group](kodify.md) | [`recruitee`](ats-recruitee.md) | 2 | 0 % | 100 % | ✅ | 843 | [Kodify Media Group](kodify.md) | [`recruitee`](ats-recruitee.md) | 2 | 0 % | 100 % | ✅ |
@@ -1092,7 +1094,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
1092 | [Imerys](imerys.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ | 1094 | [Imerys](imerys.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ |
1093 | [Industrial Electric Manufacturing](industrialelectricmanufacturing.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ | 1095 | [Industrial Electric Manufacturing](industrialelectricmanufacturing.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
1094 | [Industrious](industrious.md) | [`ashby`](ats-ashby.md) | 0 | — | — | ✅ | 1096 | [Industrious](industrious.md) | [`ashby`](ats-ashby.md) | 0 | — | — | ✅ |
1095−| [Ingeniu inc.](ingeniuinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ |
1096 | [Insite Property Solutions](insite_property_solutions.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ | 1097 | [Insite Property Solutions](insite_property_solutions.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ |
1097 | [Insomnia Cookies](insomniacookies.md) | [`lever`](ats-lever.md) | 0 | — | — | ✅ | 1098 | [Insomnia Cookies](insomniacookies.md) | [`lever`](ats-lever.md) | 0 | — | — | ✅ |
1098 | [IT-ED](ited_solutions.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ | 1099 | [IT-ED](ited_solutions.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
added docs/connecteurs/ats-odoo.md +76 −0
@@ -0,0 +1,76 @@
1+<!--
2+=============================================================================
3+Job·Ka — Groupe KA
4+Auteur : Simon-Pierre Boucher
5+Contact : contact@spboucher.ai
6+Fichier : docs/connecteurs/ats-odoo.md
7+Rôle : Fiche plateforme ATS odoo — mécanique partagée + tableau des 1 tenants
8+Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9+ relancer le script pour régénérer.
10+=============================================================================
11+-->
12+
13+# Plateforme ATS `odoo`
14+
15+**1 employeurs connectés** via cette plateforme — **2 offres actives**. Module partagé : `jobka/connectors/odoo.py` ; un employeur = une sous-classe d'environ 10 lignes.
16+
17+## Description & mécanique
18+
19+> Plateforme Odoo (module « website_hr_recruitment ») — page carrières
20+> ``/jobs`` hébergée sur le SITE de l'employeur (pas un domaine ATS partagé).
21+>
22+> - liste : GET <SITE>/jobs -> HTML rendu serveur (pas de SPA) : cartes dans
23+> le conteneur ``id="jobs_grid"``, chacune avec une ancre
24+> « /jobs/<slug>-<id numérique> », le titre dans le <h3> de la
25+> carte et un libellé de lieu libre dans le bloc <address>
26+> (« Remote », « Hybride (Bureau/Remote) », parfois une vraie
27+> adresse). Pagination Odoo « /jobs/page/N » suivie si présente.
28+> - détail : GET <SITE>/jobs/<slug>-<id> -> MICRODONNÉES schema.org (pas de
29+> JSON-LD) dans le bloc ``itemscope itemtype=…/JobPosting`` :
30+> meta datePosted/employmentType/title, div itemprop="description".
31+> ⚠️ La div description ne porte souvent que l'INTRO : le corps de
32+> l'offre (responsabilités, compétences, avantages) vit dans les
33+> blocs « website builder » qui la suivent — la description capturée
34+> court de la div jusqu'au footer. Cache BD + budget de re-visites
35+> (JOBKA_ODOO_DETAIL_LIMIT).
36+> - garde-fou : une vraie page liste porte toujours le conteneur
37+> ``jobs_grid`` (même board vide) — son absence = challenge/erreur, pas une
38+> liste vide : retry avec backoff puis erreur explicite plutôt qu'un faux
39+> « 0 offre » (même doctrine que glow/JazzHR).
40+> - lieux : Odoo publie rarement une addressLocality structurée — le bloc
41+> <address> est souvent un libellé libre (« Remote »). Le pied de page du
42+> site porte l'adresse du siège, identique partout : tout ce qui suit
43+> ``<footer`` est IGNORÉ. Cascade de décision Québec (doctrine bento_sushi,
44+> rien d'inventé) : addressLocality des microdonnées si présente, sinon
45+> libellé <address> s'il porte ville/province QC, sinon ville citée dans le
46+> bloc JobPosting (« à notre bureau de Montréal », « Située à Montréal »,
47+> « région de Montréal ») validée contre le référentiel des municipalités
48+> QC — une offre sans aucun marqueur québécois est écartée.
49+
50+## Accès
51+
52+- **Pagination** : par numéro de page
53+- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
54+- **Auth** : aucune — API/pages publiques du site carrières.
55+- **Throttle** : 1.0 s entre requêtes.
56+- **Budgets (env)** : `JOBKA_ODOO_DETAIL_LIMIT` (défaut `60`)
57+
58+## Tenants connectés
59+
60+| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
61+|---|---|---|---|---|---|---|
62+| [Ingeniu inc.](ingeniuinc.md) | 2 | 0 % | 0 % | 100 % | 2026-10-27 13:42 | ✅ |
63+
64+## Licence / conformité
65+
66+**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
67+
68+## Historique
69+
70+**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
71+- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
72+- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
73+- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
74+- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
75+- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
76+- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
modified docs/connecteurs/ats-smartrecruiters.md +174 −175
@@ -4,15 +4,15 @@ Job·Ka — Groupe KA
4 Auteur : Simon-Pierre Boucher 4 Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/ats-smartrecruiters.md 6 Fichier : docs/connecteurs/ats-smartrecruiters.md
7−Rôle : Fiche plateforme ATS smartrecruiters — mécanique partagée + tableau des 172 tenants 7+Rôle : Fiche plateforme ATS smartrecruiters — mécanique partagée + tableau des 171 tenants
8−Généré : 2026-10-26 18:17 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
12 12
13 # Plateforme ATS `smartrecruiters` 13 # Plateforme ATS `smartrecruiters`
14 14
15−**172 employeurs connectés** via cette plateforme — **2912 offres actives**. Module partagé : `jobka/connectors/smartrecruiters.py` ; un employeur = une sous-classe d'environ 10 lignes. 15+**171 employeurs connectés** via cette plateforme — **2865 offres actives**. Module partagé : `jobka/connectors/smartrecruiters.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 16
17 ## Description & mécanique 17 ## Description & mécanique
18 18
@@ -41,178 +41,177 @@ Généré : 2026-10-26 18:17 EDT par scripts/gen_connector_docs.py — NE PAS
41 41
42 | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK | 42 | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
43 |---|---|---|---|---|---|---| 43 |---|---|---|---|---|---|---|
44−| [CIMA+](cima2.md) | 260 | 1 % | 100 % | 90 % | 2026-10-26 18:05 | ✅ | 44+| [CIMA+](cima2.md) | 260 | 1 % | 100 % | 90 % | 2026-10-27 12:26 | ✅ |
45−| [Reitmans](reitmanscanadalteltd.md) | 213 | 17 % | 100 % | 31 % | 2026-10-26 15:33 | ✅ | 45+| [Reitmans](reitmanscanadalteltd.md) | 208 | 18 % | 100 % | 32 % | 2026-10-27 10:46 | ✅ |
46−| [American Iron and Metal](americanironandmetal.md) | 203 | 22 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | 46+| [American Iron and Metal](americanironandmetal.md) | 201 | 20 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ |
47−| [Sodexo Canada](sodexocanadaltd.md) | 146 | 83 % | 99 % | 6 % | 2026-10-26 15:38 | ✅ | 47+| [Sodexo Canada](sodexocanadaltd.md) | 143 | 83 % | 99 % | 6 % | 2026-10-27 10:52 | ✅ |
48−| [Ubisoft](ubisoft.md) | 139 | 0 % | 100 % | 1 % | 2026-10-26 15:44 | ✅ | 48+| [Ubisoft](ubisoft.md) | 137 | 0 % | 100 % | 1 % | 2026-10-27 10:59 | ✅ |
49−| [Vidéotron](videotron.md) | 108 | 6 % | 100 % | 42 % | 2026-10-26 15:46 | ✅ | 49+| [Artelia Canada](artelia.md) | 106 | 0 % | 100 % | 23 % | 2026-10-27 13:31 | ✅ |
50−| [Artelia Canada](artelia.md) | 106 | 0 % | 100 % | 24 % | 2026-10-26 17:52 | ✅ | 50+| [Groupe Helios](groupehelios.md) | 105 | 2 % | 100 % | 2 % | 2026-10-27 12:45 | ✅ |
51−| [Groupe Helios](groupehelios.md) | 104 | 2 % | 100 % | 2 % | 2026-10-26 17:28 | ✅ | 51+| [Vidéotron](videotron.md) | 102 | 7 % | 100 % | 42 % | 2026-10-27 11:01 | ✅ |
52−| [UAP Inc.](uapinc.md) | 88 | 43 % | 98 % | 32 % | 2026-10-26 15:44 | ✅ | 52+| [UAP Inc.](uapinc.md) | 85 | 44 % | 98 % | 31 % | 2026-10-27 10:59 | ✅ |
53−| [Linen Chest](linenchest.md) | 84 | 8 % | 100 % | 6 % | 2026-10-26 15:15 | ✅ | 53+| [Linen Chest](linenchest.md) | 84 | 8 % | 100 % | 6 % | 2026-10-27 13:18 | ✅ |
54−| [Renaud-Bray](renaud_bray.md) | 82 | 1 % | 100 % | 1 % | 2026-10-26 15:33 | ✅ | 54+| [Renaud-Bray](renaud_bray.md) | 82 | 1 % | 100 % | 1 % | 2026-10-27 10:46 | ✅ |
55−| [EMCO](emcocorporation.md) | 64 | 39 % | 100 % | 6 % | 2026-10-26 18:13 | ✅ | 55+| [EMCO](emcocorporation.md) | 64 | 39 % | 100 % | 6 % | 2026-10-27 12:36 | ✅ |
56−| [Dexterra](dexterra.md) | 62 | 0 % | 100 % | 11 % | 2026-10-26 18:10 | ✅ | 56+| [Dexterra](dexterra.md) | 61 | 0 % | 100 % | 11 % | 2026-10-27 12:32 | ✅ |
57−| [Groupe Canam](groupecanam.md) | 53 | 72 % | 98 % | 28 % | 2026-10-26 17:28 | ✅ | 57+| [Groupe Canam](groupecanam.md) | 52 | 71 % | 98 % | 29 % | 2026-10-27 12:45 | ✅ |
58−| [Techo-Bloc](techo_bloc.md) | 46 | 39 % | 100 % | 30 % | 2026-10-26 15:41 | ✅ | 58+| [Info-Ways](info_ways.md) | 39 | 0 % | 100 % | 8 % | 2026-10-27 13:07 | ✅ |
59−| [Info-Ways](info_ways.md) | 39 | 0 % | 100 % | 8 % | 2026-10-26 17:40 | ✅ | 59+| [Techo-Bloc](techo_bloc.md) | 38 | 37 % | 100 % | 32 % | 2026-10-27 10:56 | ✅ |
60−| [Sopra Steria](soprasteria1.md) | 38 | 0 % | 100 % | 84 % | 2026-10-26 15:39 | ✅ | 60+| [Sopra Steria](soprasteria1.md) | 38 | 0 % | 100 % | 84 % | 2026-10-27 10:52 | ✅ |
61−| [system canada technologies](systemcanadatechnologies.md) | 38 | 0 % | 100 % | 0 % | 2026-10-26 15:40 | ✅ | 61+| [system canada technologies](systemcanadatechnologies.md) | 38 | 0 % | 100 % | 0 % | 2026-10-27 10:55 | ✅ |
62−| [KABS](kabs.md) | 36 | 0 % | 100 % | 3 % | 2026-10-26 15:12 | ✅ | 62+| [QSL](qsl.md) | 34 | 29 % | 100 % | 6 % | 2026-10-27 10:45 | ✅ |
63−| [QSL](qsl.md) | 35 | 29 % | 100 % | 6 % | 2026-10-26 15:32 | ✅ | 63+| [KABS](kabs.md) | 34 | 0 % | 100 % | 3 % | 2026-10-27 13:15 | ✅ |
64−| [Rodeo FX](rodeofx.md) | 31 | 0 % | 94 % | 10 % | 2026-10-26 15:34 | ✅ | 64+| [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | 29 | 0 % | 100 % | 76 % | 2026-10-27 13:18 | ✅ |
65−| [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | 29 | 0 % | 100 % | 76 % | 2026-10-26 15:15 | ✅ | 65+| [Rodeo FX](rodeofx.md) | 27 | 0 % | 93 % | 11 % | 2026-10-27 10:47 | ✅ |
66−| [AccorHotel](accorhotel.md) | 28 | 61 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | 66+| [Structube](structube1.md) | 27 | 0 % | 100 % | 0 % | 2026-10-27 10:54 | ✅ |
67−| [Structube](structube1.md) | 27 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 67+| [Wabtec](wabtec.md) | 25 | 16 % | 100 % | 36 % | 2026-10-27 11:02 | ✅ |
68−| [AbbVie](abbvie.md) | 26 | 0 % | 100 % | 92 % | 2026-10-26 17:48 | ✅ | 68+| [AbbVie](abbvie.md) | 24 | 0 % | 100 % | 92 % | 2026-10-27 13:27 | ✅ |
69−| [Transat A.T.](transatat1.md) | 25 | 8 % | 100 % | 36 % | 2026-10-26 15:43 | ✅ | 69+| [MEDFAR Solutions Cliniques](medfar.md) | 23 | 0 % | 100 % | 91 % | 2026-10-27 13:21 | ✅ |
70−| [Wabtec](wabtec.md) | 25 | 16 % | 100 % | 36 % | 2026-10-26 15:46 | ✅ | 70+| [Transat A.T.](transatat1.md) | 23 | 0 % | 100 % | 30 % | 2026-10-27 10:58 | ✅ |
71−| [MEDFAR Solutions Cliniques](medfar.md) | 24 | 0 % | 100 % | 92 % | 2026-10-26 15:18 | ✅ | 71+| [AccorHotel](accorhotel.md) | 22 | 50 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
72−| [Spectrum Health Care](spectrumhealthcare.md) | 22 | 95 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 72+| [Spectrum Health Care](spectrumhealthcare.md) | 22 | 95 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ |
73−| [ATIA Ltd](atialtd.md) | 21 | 38 % | 100 % | 0 % | 2026-10-26 17:53 | ✅ | 73+| [ATIA Ltd](atialtd.md) | 21 | 38 % | 100 % | 0 % | 2026-10-27 13:31 | ✅ |
74−| [Distribution stox](distributionstox2.md) | 20 | 25 % | 100 % | 50 % | 2026-10-26 18:10 | ✅ | 74+| [Distribution stox](distributionstox2.md) | 20 | 25 % | 100 % | 50 % | 2026-10-27 12:33 | ✅ |
75−| [NBCUniversal](nbcuniversal3.md) | 20 | 0 % | 100 % | 85 % | 2026-10-26 15:26 | ✅ | 75+| [NBCUniversal](nbcuniversal3.md) | 20 | 0 % | 95 % | 85 % | 2026-10-27 13:24 | ✅ |
76−| [Sia](sia.md) | 20 | 0 % | 100 % | 30 % | 2026-10-26 15:37 | ✅ | 76+| [Sia](sia.md) | 20 | 0 % | 100 % | 30 % | 2026-10-27 10:50 | ✅ |
77−| [Vosker](vosker.md) | 19 | 0 % | 100 % | 89 % | 2026-10-26 15:46 | ✅ | 77+| [Vosker](vosker.md) | 19 | 0 % | 100 % | 89 % | 2026-10-27 11:01 | ✅ |
78−| [Sika Canada](sikaag.md) | 19 | 5 % | 100 % | 16 % | 2026-10-26 15:37 | ✅ | 78+| [Scalian](scalian.md) | 19 | 16 % | 100 % | 100 % | 2026-10-27 10:49 | ✅ |
79−| [Scalian](scalian.md) | 19 | 16 % | 100 % | 100 % | 2026-10-26 15:36 | ✅ | 79+| [H&M](hmgroup.md) | 18 | 0 % | 100 % | 0 % | 2026-10-27 13:05 | ✅ |
80−| [H&M](hmgroup.md) | 18 | 0 % | 100 % | 0 % | 2026-10-26 17:38 | ✅ | 80+| [REXEL](rexel1.md) | 18 | 0 % | 100 % | 0 % | 2026-10-27 10:47 | ✅ |
81−| [REXEL](rexel1.md) | 18 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | 81+| [Sika Canada](sikaag.md) | 17 | 6 % | 100 % | 18 % | 2026-10-27 10:51 | ✅ |
82−| [Egis Group](egisgroup.md) | 16 | 0 % | 100 % | 25 % | 2026-10-26 18:13 | ✅ | 82+| [Frima Studio](frimastudio.md) | 17 | 0 % | 100 % | 94 % | 2026-10-27 12:41 | ✅ |
83−| [AECOM](aecom2.md) | 15 | 0 % | 100 % | 80 % | 2026-10-26 17:50 | ✅ | 83+| [Egis Group](egisgroup.md) | 16 | 0 % | 100 % | 25 % | 2026-10-27 12:36 | ✅ |
84−| [Frima Studio](frimastudio.md) | 15 | 0 % | 100 % | 93 % | 2026-10-26 17:24 | ✅ | 84+| [AECOM](aecom2.md) | 15 | 0 % | 100 % | 80 % | 2026-10-27 13:28 | ✅ |
85−| [Renovco](renovco.md) | 14 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | 85+| [Renovco](renovco.md) | 14 | 0 % | 100 % | 0 % | 2026-10-27 10:46 | ✅ |
86−| [Gameloft](gameloft.md) | 13 | 0 % | 100 % | 69 % | 2026-10-26 17:24 | ✅ | 86+| [Gameloft](gameloft.md) | 13 | 0 % | 100 % | 69 % | 2026-10-27 12:41 | ✅ |
87−| [Lemay](lemay.md) | 13 | 8 % | 100 % | 69 % | 2026-10-26 15:15 | ✅ | 87+| [Lemay](lemay.md) | 13 | 8 % | 100 % | 69 % | 2026-10-27 13:18 | ✅ |
88−| [Groupe Montoni](groupemontoni.md) | 13 | 0 % | 100 % | 15 % | 2026-10-26 17:28 | ✅ | 88+| [Groupe Montoni](groupemontoni.md) | 13 | 0 % | 100 % | 15 % | 2026-10-27 12:45 | ✅ |
89−| [Relais & Châteaux](relaischateaux.md) | 13 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | 89+| [Talan](talan.md) | 12 | 0 % | 100 % | 83 % | 2026-10-27 10:55 | ✅ |
90−| [Talan](talan.md) | 12 | 0 % | 100 % | 83 % | 2026-10-26 15:40 | ✅ | 90+| [McWane Canada](mcwanecanada.md) | 12 | 58 % | 100 % | 0 % | 2026-10-27 13:21 | ✅ |
91−| [McWane Canada](mcwanecanada.md) | 12 | 58 % | 100 % | 0 % | 2026-10-26 15:18 | ✅ | 91+| [Relais & Châteaux](relaischateaux.md) | 12 | 0 % | 100 % | 0 % | 2026-10-27 10:46 | ✅ |
92−| [Indigo Books & Music](indigobooksmusic.md) | 11 | 0 % | 100 % | 0 % | 2026-10-26 17:40 | ✅ | 92+| [Indigo Books & Music](indigobooksmusic.md) | 11 | 0 % | 100 % | 0 % | 2026-10-27 13:07 | ✅ |
93−| [Oliver & Bonacini](oliverbonacini.md) | 11 | 27 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | 93+| [Oliver & Bonacini](oliverbonacini.md) | 11 | 27 % | 100 % | 0 % | 2026-10-27 10:40 | ✅ |
94−| [Mattel (Mega Bloks)](mattelinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 94+| [Mattel (Mega Bloks)](mattelinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ |
95−| [Airlab Inc.](airlabinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | 95+| [Airlab Inc.](airlabinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-27 13:29 | ✅ |
96−| [R&D Partners](rdpartners1.md) | 10 | 0 % | 100 % | 80 % | 2026-10-26 15:32 | ✅ | 96+| [R&D Partners](rdpartners1.md) | 10 | 0 % | 100 % | 80 % | 2026-10-27 10:46 | ✅ |
97−| [J'Excelle](jexcelleinc.md) | 9 | 0 % | 100 % | 11 % | 2026-10-26 17:42 | ✅ | 97+| [Turner & Townsend](turnertownsend.md) | 10 | 40 % | 100 % | 60 % | 2026-10-27 10:59 | ✅ |
98−| [act digital](altersolutions.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | 98+| [J'Excelle](jexcelleinc.md) | 9 | 0 % | 100 % | 11 % | 2026-10-27 13:09 | ✅ |
99−| [LGT](lgt1.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | 99+| [act digital](altersolutions.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ |
100−| [Manitoulin Group of Companies](manitoulingroupofcompanies.md) | 9 | 56 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 100+| [JYSK Canada](jyskcanada.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:15 | ✅ |
101−| [Utask](utask.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 15:45 | ✅ | 101+| [LGT](lgt1.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ |
102−| [CF Montréal](cfmontreal.md) | 8 | 0 % | 75 % | 0 % | 2026-10-26 18:03 | ✅ | 102+| [Manitoulin Group of Companies](manitoulingroupofcompanies.md) | 9 | 56 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ |
103−| [People Can Fly](peoplecanfly.md) | 8 | 0 % | 100 % | 100 % | 2026-10-26 15:28 | ✅ | 103+| [Utask](utask.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 11:00 | ✅ |
104−| [Canadian Helicopters](canadianhelicopters.md) | 8 | 0 % | 100 % | 0 % | 2026-10-26 17:57 | ✅ | 104+| [CF Montréal](cfmontreal.md) | 8 | 0 % | 75 % | 0 % | 2026-10-27 12:24 | ✅ |
105−| [Expresco Foods](exprescofoods.md) | 8 | 12 % | 100 % | 0 % | 2026-10-26 18:16 | ✅ | 105+| [People Can Fly](peoplecanfly.md) | 8 | 0 % | 100 % | 100 % | 2026-10-27 10:41 | ✅ |
106−| [JYSK Canada](jyskcanada.md) | 8 | 0 % | 100 % | 0 % | 2026-10-26 15:12 | ✅ | 106+| [Canadian Helicopters](canadianhelicopters.md) | 8 | 0 % | 100 % | 0 % | 2026-10-27 13:37 | ✅ |
107−| [Turner & Townsend](turnertownsend.md) | 8 | 25 % | 100 % | 75 % | 2026-10-26 15:44 | ✅ | 107+| [Expresco Foods](exprescofoods.md) | 8 | 12 % | 100 % | 0 % | 2026-10-27 12:39 | ✅ |
108−| [MalOPlus Group Inc.](maloplusteleservices1.md) | 8 | 0 % | 100 % | 88 % | 2026-10-26 15:16 | ✅ | 108+| [MalOPlus Group Inc.](maloplusteleservices1.md) | 8 | 0 % | 100 % | 88 % | 2026-10-27 13:19 | ✅ |
109−| [ISAAC Instruments](isaacinstruments.md) | 8 | 0 % | 100 % | 75 % | 2026-10-26 17:42 | ✅ | 109+| [ISAAC Instruments](isaacinstruments.md) | 8 | 0 % | 100 % | 75 % | 2026-10-27 13:08 | ✅ |
110−| [MalOPlus Group](maloplusteleservices.md) | 8 | 0 % | 0 % | 100 % | 2026-10-26 15:16 | ✅ | 110+| [MalOPlus Group](maloplusteleservices.md) | 8 | 0 % | 0 % | 100 % | 2026-10-27 13:19 | ✅ |
111−| [1perTInent inc](x1pertinentinc.md) | 7 | 0 % | 100 % | 71 % | 2026-10-26 15:49 | ✅ | 111+| [1perTInent inc](x1pertinentinc.md) | 7 | 0 % | 100 % | 71 % | 2026-10-27 11:08 | ✅ |
112−| [Chagall Design](chagalldesign.md) | 7 | 0 % | 100 % | 0 % | 2026-10-26 18:04 | ✅ | 112+| [Chagall Design](chagalldesign.md) | 7 | 0 % | 100 % | 0 % | 2026-10-27 12:25 | ✅ |
113−| [Hydrogen Research Institute](hydrogenresearchinstitute.md) | 7 | 14 % | 100 % | 0 % | 2026-10-26 17:39 | ✅ | 113+| [Hydrogen Research Institute](hydrogenresearchinstitute.md) | 7 | 14 % | 100 % | 0 % | 2026-10-27 13:05 | ✅ |
114−| [Trigyn Technologies](trigyntechnologies1.md) | 7 | 0 % | 100 % | 0 % | 2026-10-26 15:43 | ✅ | 114+| [Trigyn Technologies](trigyntechnologies1.md) | 7 | 0 % | 100 % | 0 % | 2026-10-27 10:58 | ✅ |
115−| [Innovation RH inc.](innovationrh.md) | 7 | 14 % | 100 % | 29 % | 2026-10-26 17:41 | ✅ | 115+| [Innovation RH inc.](innovationrh.md) | 7 | 14 % | 100 % | 29 % | 2026-10-27 13:07 | ✅ |
116−| [ServiceNow](servicenow.md) | 6 | 0 % | 100 % | 83 % | 2026-10-26 15:36 | ✅ | 116+| [ServiceNow](servicenow.md) | 6 | 0 % | 100 % | 83 % | 2026-10-27 10:50 | ✅ |
117−| [Accedian Networks](accediannetworks.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 17:48 | ✅ | 117+| [Accedian Networks](accediannetworks.md) | 6 | 0 % | 100 % | 0 % | 2026-10-27 13:27 | ✅ |
118−| [Léger](leger2.md) | 6 | 33 % | 100 % | 100 % | 2026-10-26 15:15 | ✅ | 118+| [Léger](leger2.md) | 6 | 33 % | 100 % | 100 % | 2026-10-27 13:18 | ✅ |
119−| [Right Talent Right Now](righttalentrightnow.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | 119+| [Right Talent Right Now](righttalentrightnow.md) | 6 | 0 % | 100 % | 0 % | 2026-10-27 10:47 | ✅ |
120−| [Yaksa](yaksa.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 15:50 | ✅ | 120+| [Yaksa](yaksa.md) | 6 | 0 % | 100 % | 0 % | 2026-10-27 11:08 | ✅ |
121−| [Astucemedia](astucemedia.md) | 5 | 0 % | 100 % | 60 % | 2026-10-26 17:52 | ✅ | 121+| [Astucemedia](astucemedia.md) | 5 | 0 % | 100 % | 60 % | 2026-10-27 13:31 | ✅ |
122−| [Cornerstone Building Brands](cornerstonebuildingbrandscareers.md) | 5 | 40 % | 100 % | 20 % | 2026-10-26 18:09 | ✅ | 122+| [Cornerstone Building Brands](cornerstonebuildingbrandscareers.md) | 5 | 40 % | 100 % | 20 % | 2026-10-27 12:31 | ✅ |
123−| [MVV](mvv1.md) | 5 | 0 % | 100 % | 60 % | 2026-10-26 15:25 | ✅ | 123+| [Groupe Beaudry](groupebeaudry.md) | 5 | 40 % | 100 % | 0 % | 2026-10-27 12:45 | ✅ |
124−| [HoYoverse](hoyoverse.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 17:38 | ✅ | 124+| [MVV](mvv1.md) | 5 | 0 % | 100 % | 60 % | 2026-10-27 13:24 | ✅ |
125−| [GURU Boisson Énergisante](guruorganicenergydrink.md) | 4 | 0 % | 100 % | 75 % | 2026-10-26 17:35 | ✅ | 125+| [HoYoverse](hoyoverse.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:05 | ✅ |
126−| [Acumatica](acumatica.md) | 4 | 25 % | 100 % | 100 % | 2026-10-26 17:49 | ✅ | 126+| [GURU Boisson Énergisante](guruorganicenergydrink.md) | 4 | 0 % | 100 % | 75 % | 2026-10-27 13:01 | ✅ |
127−| [Boreala Management](borealamanagement.md) | 4 | 0 % | 100 % | 50 % | 2026-10-26 17:56 | ✅ | 127+| [Acumatica](acumatica.md) | 4 | 25 % | 100 % | 100 % | 2026-10-27 13:28 | ✅ |
128−| [Chewi Creative](chewicreative.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 18:05 | ✅ | 128+| [Boreala Management](borealamanagement.md) | 4 | 0 % | 100 % | 50 % | 2026-10-27 13:35 | ✅ |
129−| [Continental Group Sector ContiTech](continentalgroupsectorcontitech.md) | 4 | 25 % | 100 % | 25 % | 2026-10-26 18:08 | ✅ | 129+| [Chewi Creative](chewicreative.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 12:26 | ✅ |
130−| [Ensiti](ensiti.md) | 4 | 0 % | 100 % | 75 % | 2026-10-26 18:13 | ✅ | 130+| [Continental Group Sector ContiTech](continentalgroupsectorcontitech.md) | 4 | 25 % | 100 % | 25 % | 2026-10-27 12:31 | ✅ |
131−| [Groupe Beaudry](groupebeaudry.md) | 4 | 25 % | 100 % | 0 % | 2026-10-26 17:28 | ✅ | 131+| [Ensiti](ensiti.md) | 4 | 0 % | 100 % | 75 % | 2026-10-27 12:36 | ✅ |
132−| [Luckyhammers](luckyhammers.md) | 4 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 132+| [Luckyhammers](luckyhammers.md) | 4 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ |
133−| [META4](meta4.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:20 | ✅ | 133+| [META4](meta4.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:23 | ✅ |
134−| [Nmédia](nmdia.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:26 | ✅ | 134+| [Nmédia](nmdia.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:25 | ✅ |
135−| [O-I](o_i.md) | 4 | 25 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | 135+| [O-I](o_i.md) | 4 | 50 % | 100 % | 0 % | 2026-10-27 13:26 | ✅ |
136−| [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:28 | ✅ | 136+| [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 10:41 | ✅ |
137−| [Outpost VFX](outpostvfx.md) | 4 | 0 % | 100 % | 25 % | 2026-10-26 15:28 | ✅ | 137+| [Outpost VFX](outpostvfx.md) | 4 | 0 % | 100 % | 25 % | 2026-10-27 10:41 | ✅ |
138−| [Prelib](prelib.md) | 4 | 75 % | 100 % | 50 % | 2026-10-26 15:28 | ✅ | 138+| [Prelib](prelib.md) | 4 | 75 % | 100 % | 50 % | 2026-10-27 10:42 | ✅ |
139−| [Pyrotek](pyrotek3.md) | 4 | 75 % | 100 % | 0 % | 2026-10-26 15:32 | ✅ | 139+| [Pyrotek](pyrotek3.md) | 4 | 75 % | 100 % | 0 % | 2026-10-27 10:45 | ✅ |
140−| [Trigone](trigone.md) | 4 | 0 % | 100 % | 0 % | 2026-10-26 15:43 | ✅ | 140+| [Trigone](trigone.md) | 4 | 0 % | 100 % | 0 % | 2026-10-27 10:58 | ✅ |
141−| [Agence Maplr Inc.](agencemaplrinc.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | 141+| [Agence Maplr Inc.](agencemaplrinc.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
142−| [Continental Technology Solutions](continentaltechnologysolutions.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 18:08 | ✅ | 142+| [Continental Technology Solutions](continentaltechnologysolutions.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 12:31 | ✅ |
143−| [Cygnus Professionals Inc](cygnusprofessionalsinc2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 18:09 | ✅ | 143+| [Cygnus Professionals Inc](cygnusprofessionalsinc2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 12:31 | ✅ |
144−| [Dev](dev2.md) | 3 | 100 % | 100 % | 33 % | 2026-10-26 18:10 | ✅ | 144+| [Dev](dev2.md) | 3 | 100 % | 100 % | 33 % | 2026-10-27 12:32 | ✅ |
145−| [Gentek Building Products Ltd Partnership](gentekbuildingproductsltdpartner.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 17:25 | ✅ | 145+| [Gentek Building Products Ltd Partnership](gentekbuildingproductsltdpartner.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 12:41 | ✅ |
146−| [Intersand](intersand.md) | 3 | 0 % | 100 % | 33 % | 2026-10-26 17:41 | ✅ | 146+| [Intersand](intersand.md) | 3 | 0 % | 100 % | 33 % | 2026-10-27 13:08 | ✅ |
147−| [Keyrus](keyrus2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:13 | ✅ | 147+| [Keyrus](keyrus2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:16 | ✅ |
148−| [Mannarino Systems & Software Inc.](mannarinosystemssoftwareinc.md) | 3 | 0 % | 100 % | 33 % | 2026-10-26 15:16 | ✅ | 148+| [Mannarino Systems & Software Inc.](mannarinosystemssoftwareinc.md) | 3 | 0 % | 100 % | 33 % | 2026-10-27 13:19 | ✅ |
149−| [Mecar Métal](mecarmtal.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:18 | ✅ | 149+| [Mecar Métal](mecarmtal.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:21 | ✅ |
150−| [Naisense Solutions Inc](naisensesolutionsinc.md) | 3 | 0 % | 100 % | 100 % | 2026-10-26 15:26 | ✅ | 150+| [Naisense Solutions Inc](naisensesolutionsinc.md) | 3 | 0 % | 100 % | 100 % | 2026-10-27 13:24 | ✅ |
151−| [Oboxmedia](oboxmedia1.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | 151+| [Oboxmedia](oboxmedia1.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:26 | ✅ |
152−| [A2 Design](a2design.md) | 3 | 0 % | 100 % | 100 % | 2026-10-26 17:48 | ✅ | 152+| [A2 Design](a2design.md) | 3 | 0 % | 100 % | 100 % | 2026-10-27 13:26 | ✅ |
153−| [LE CAFÉ DES ARTISTES](lecafdesartistes.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | 153+| [LE CAFÉ DES ARTISTES](lecafdesartistes.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ |
154−| [Playmind](playmind.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 15:28 | ✅ | 154+| [Playmind](playmind.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 10:41 | ✅ |
155−| [ADVENS](advens.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | 155+| [ADVENS](advens.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
156−| [Catalyst Canada](catalystcanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 18:02 | ✅ | 156+| [Catalyst Canada](catalystcanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 13:41 | ✅ |
157−| [Conseil régional de l'environnement - Région de la Capitale Nationale](conseilrgionaldelenvironnement_rgiondelacapitalenationale.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 18:08 | ✅ | 157+| [Conseil régional de l'environnement - Région de la Capitale Nationale](conseilrgionaldelenvironnement_rgiondelacapitalenationale.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 12:30 | ✅ |
158−| [DONTNOD](dontnod.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 18:11 | ✅ | 158+| [DONTNOD](dontnod.md) | 2 | 0 % | 100 % | 100 % | 2026-10-27 12:33 | ✅ |
159−| [FZ Engineering](fzengineering.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 17:24 | ✅ | 159+| [FZ Engineering](fzengineering.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 12:41 | ✅ |
160−| [Loiselle inc.](loiselleinc.md) | 2 | 0 % | 100 % | 50 % | 2026-10-26 15:16 | ✅ | 160+| [Loiselle inc.](loiselleinc.md) | 2 | 0 % | 100 % | 50 % | 2026-10-27 13:18 | ✅ |
161−| [MSX International](msxinternational.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 15:25 | ✅ | 161+| [MSX International](msxinternational.md) | 2 | 0 % | 100 % | 100 % | 2026-10-27 13:24 | ✅ |
162−| [McDonald's Restaurants](mcdonaldscanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 162+| [McDonald's Restaurants](mcdonaldscanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ |
163−| [Santropol Roulant](santropolroulant.md) | 2 | 50 % | 100 % | 0 % | 2026-10-26 15:35 | ✅ | 163+| [Santropol Roulant](santropolroulant.md) | 2 | 50 % | 100 % | 0 % | 2026-10-27 10:49 | ✅ |
164−| [The Climate Reality Project Canada](theclimaterealityprojectcanada.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 15:43 | ✅ | 164+| [The Climate Reality Project Canada](theclimaterealityprojectcanada.md) | 2 | 0 % | 100 % | 100 % | 2026-10-27 10:58 | ✅ |
165−| [Waterwell Irrigation](waterwellirrigation.md) | 2 | 50 % | 100 % | 0 % | 2026-10-26 15:49 | ✅ | 165+| [Waterwell Irrigation](waterwellirrigation.md) | 2 | 50 % | 100 % | 0 % | 2026-10-27 11:07 | ✅ |
166−| [Lactanet](lactanet.md) | 2 | 0 % | 50 % | 0 % | 2026-10-26 15:14 | ✅ | 166+| [GoLogic](gologic.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:43 | ✅ |
167−| [GoLogic](gologic.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:27 | ✅ | 167+| [Sparkgrid](sparkgrid.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ |
168−| [Sparkgrid](sparkgrid.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 168+| [Stelpro](stelpro.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ |
169−| [Stelpro](stelpro.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 169+| [Talsom](talsom.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:55 | ✅ |
170−| [Talsom](talsom.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:40 | ✅ | 170+| [Xplornet](xplornet.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 11:08 | ✅ |
171−| [Xplornet](xplornet.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:50 | ✅ | 171+| [Centre multiethnique de Québec](centremultiethniquedequbec.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 12:24 | ✅ |
172−| [Centre multiethnique de Québec](centremultiethniquedequbec.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 18:03 | ✅ | 172+| [École des entrepreneurs du Québec](coledesentrepreneursduqubec.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 12:30 | ✅ |
173−| [École des entrepreneurs du Québec](coledesentrepreneursduqubec.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 18:08 | ✅ | 173+| [ADGA Group Consultants Inc](adgagroupconsultantsinc1.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
174−| [ADGA Group Consultants Inc](adgagroupconsultantsinc1.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | 174+| [AG Globe Services](agglobeservices.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
175−| [AG Globe Services](agglobeservices.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | 175+| [AVEQ](aveq.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:32 | ✅ |
176−| [AVEQ](aveq.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:54 | ✅ | 176+| [Ariolix](ariolix.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ |
177−| [Ariolix](ariolix.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | 177+| [Averna](averna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:32 | ✅ |
178−| [Averna](averna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:54 | ✅ | 178+| [C2 Montréal](c2montral.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:36 | ✅ |
179−| [C2 Montréal](c2montral.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:57 | ✅ | 179+| [CM Labs](cmlabs.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 12:30 | ✅ |
180−| [CM Labs](cmlabs.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 18:08 | ✅ | 180+| [Club Assurance](clubassurance.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:30 | ✅ |
181−| [Club Assurance](clubassurance.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:08 | ✅ | 181+| [DLC Teams](dlcteams.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:33 | ✅ |
182−| [DLC Teams](dlcteams.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:10 | ✅ | 182+| [E*Pro Inc](eproinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:36 | ✅ |
183−| [E*Pro Inc](eproinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:13 | ✅ | 183+| [Fenêtres Concept inc.](fentresconceptinc.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:40 | ✅ |
184−| [Fenêtres Concept inc.](fentresconceptinc.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:17 | ✅ | 184+| [Infrastructel Inc.](infrastructelinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:07 | ✅ |
185−| [Infrastructel Inc.](infrastructelinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:41 | ✅ | 185+| [Mobz](jobmobz1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:15 | ✅ |
186−| [Ingeniu inc.](ingeniuinc.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:41 | ✅ | 186+| [LVMH Perfumes & Cosmetics](lvmhperfumescosmetics.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ |
187−| [Mobz](jobmobz1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:12 | ✅ | 187+| [Logient](logient.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ |
188−| [LVMH Perfumes & Cosmetics](lvmhperfumescosmetics.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 188+| [Marquis Imprimeur Inc.](marquisimprimeurinc.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 13:19 | ✅ |
189−| [Logient](logient.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | 189+| [Nexxus Foods](nexxusfoods.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:25 | ✅ |
190−| [Marquis Imprimeur Inc.](marquisimprimeurinc.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 15:16 | ✅ | 190+| [ON Animation Studio](onanimationstudio.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:40 | ✅ |
191−| [Nexxus Foods](nexxusfoods.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:26 | ✅ | 191+| [Recruitment Solutions Integrators](recruitmentsolutionsintegrators.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:46 | ✅ |
192−| [ON Animation Studio](onanimationstudio.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | 192+| [Segic](segic.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 10:49 | ✅ |
193−| [Recruitment Solutions Integrators](recruitmentsolutionsintegrators.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:32 | ✅ | 193+| [spruceinfotech](spruceinfotech2.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ |
194−| [Segic](segic.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:36 | ✅ | 194+| [Star Marketing](starmarketing.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ |
195−| [spruceinfotech](spruceinfotech2.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 195+| [Tyco](tyco.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:59 | ✅ |
196−| [Star Marketing](starmarketing.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | 196+| [WCG International Consultants Ltd.](wcginternationalconsultantsltd.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 11:07 | ✅ |
197−| [Tyco](tyco.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:44 | ✅ | 197+| [Westcliff](westcliff.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 11:08 | ✅ |
198−| [WCG International Consultants Ltd.](wcginternationalconsultantsltd.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 15:49 | ✅ | 198+| [ADF Diesel](adfdiesel.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ |
199−| [Westcliff](westcliff.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:49 | ✅ | 199+| [DIMENSION COMPOSITE INC](dimensioncompositeinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:33 | ✅ |
200−| [ADF Diesel](adfdiesel.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | 200+| [Dimonoff](dimonoff.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 12:33 | ✅ |
201−| [DIMENSION COMPOSITE INC](dimensioncompositeinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:10 | ✅ | 201+| [Ekosystem](ekosystem.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:36 | ✅ |
202−| [Dimonoff](dimonoff.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 18:10 | ✅ | 202+| [Lactanet](lactanet.md) | 1 | 0 % | 0 % | 0 % | 2026-10-27 13:17 | ✅ |
203−| [Ekosystem](ekosystem.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:13 | ✅ | 203+| [Maison l'Échelon](maisonlchelon.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ |
204−| [Maison l'Échelon](maisonlchelon.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | 204+| [Tonic DNA](tonicdna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 10:58 | ✅ |
205−| [Tonic DNA](tonicdna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:43 | ✅ | 205+| [Venture Media](venturemedia.md) | 0 | — | — | — | 2026-10-27 11:01 | ✅ |
206−| [Venture Media](venturemedia.md) | 0 | — | — | — | 2026-10-26 15:45 | ✅ | 206+| [California Closets](californiaclosets.md) | 0 | — | — | — | 2026-10-27 13:36 | ✅ |
207−| [California Closets](californiaclosets.md) | 0 | — | — | — | 2026-10-26 17:57 | ✅ | 207+| [Trupanion](trupanion1.md) | 0 | — | — | — | 2026-10-27 10:59 | ✅ |
208−| [Trupanion](trupanion1.md) | 0 | — | — | — | 2026-10-26 15:44 | ✅ | 208+| [Arago](arago.md) | 0 | — | — | — | 2026-10-27 13:30 | ✅ |
209−| [Arago](arago.md) | 0 | — | — | — | 2026-10-26 17:52 | ✅ | 209+| [CCA](cca1.md) | 0 | — | — | — | 2026-10-27 13:41 | ✅ |
210−| [CCA](cca1.md) | 0 | — | — | — | 2026-10-26 18:02 | ✅ | 210+| [General Dynamics Missions System International](gdmsi.md) | 0 | — | — | — | 2026-10-27 12:41 | ✅ |
211−| [General Dynamics Missions System International](gdmsi.md) | 0 | — | — | — | 2026-10-26 17:25 | ✅ | 211+| [J.S. Held LLC](jsheldllc.md) | 0 | — | — | — | 2026-10-27 13:15 | ✅ |
212−| [J.S. Held LLC](jsheldllc.md) | 0 | — | — | — | 2026-10-26 15:12 | ✅ | 212+| [NielsenIQ](nielseniq.md) | 0 | — | — | — | 2026-10-27 13:25 | ✅ |
213−| [NielsenIQ](nielseniq.md) | 0 | — | — | — | 2026-10-26 15:26 | ✅ | 213+| [Software Mind](softwaremind.md) | 0 | — | — | — | 2026-10-27 10:52 | ✅ |
214−| [Software Mind](softwaremind.md) | 0 | — | — | — | 2026-10-26 15:38 | ✅ | 214+| [Évolupharma Inc.](volupharmainc.md) | 0 | — | — | — | 2026-10-27 11:01 | ✅ |
215−| [Évolupharma Inc.](volupharmainc.md) | 0 | — | — | — | 2026-10-26 18:16 | ✅ |
216 215
217 ## Licence / conformité 216 ## Licence / conformité
218 217
modified docs/connecteurs/ingeniuinc.md +23 −22
@@ -4,39 +4,40 @@ Job·Ka — Groupe KA
4 Auteur : Simon-Pierre Boucher 4 Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/ingeniuinc.md 6 Fichier : docs/connecteurs/ingeniuinc.md
7−Rôle : Fiche connecteur — Ingeniu inc. (employeur direct, ATS smartrecruiters) 7+Rôle : Fiche connecteur — Ingeniu inc. (employeur direct, ATS odoo)
8−Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
12 12
13 # Ingeniu inc. (`ingeniuinc`) 13 # Ingeniu inc. (`ingeniuinc`)
14 14
15−**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/ingeniuinc.py` 15+**Employeur direct** · Plateforme ATS : [`odoo`](ats-odoo.md) · Statut registre : actif · Connecteur : `jobka/connectors/ingeniuinc.py`
16 16
17 ## Description 17 ## Description
18 18
19−- **Site** : [Ingeniu inc.]() 19+- **Site** : [Ingeniu inc.](https://www.ingeniusolutions.com)
20−- **Page carrières** : https://jobs.smartrecruiters.com/company/IngeniuInc 20+- **Page carrières** : https://www.ingeniusolutions.com/jobs
21 - **Secteurs** : Ingénierie, Conseil 21 - **Secteurs** : Ingénierie, Conseil
22 - **Région** : Montréal 22 - **Région** : Montréal
23 - Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire. 23 - Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 24
25 ## Accès 25 ## Accès
26 26
27−- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme). 27+- **Mécanique** : voir la fiche plateforme [`ats-odoo.md`](ats-odoo.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 - **Identifiants du tenant** (attributs du connecteur) : 28 - **Identifiants du tenant** (attributs du connecteur) :
29 29
30 | Attribut | Valeur | 30 | Attribut | Valeur |
31 |---|---| 31 |---|---|
32−| `COMPANY` | `IngeniuInc` |
33 | `EMPLOYER` | `Ingeniu inc.` | 32 | `EMPLOYER` | `Ingeniu inc.` |
34−- **Throttle** : 0.7 s entre requêtes. 33+| `JOBS_PATH` | `/jobs` |
34+| `SITE` | `https://www.ingeniusolutions.com` |
35+- **Throttle** : 1.0 s entre requêtes.
35 - **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client). 36 - **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 37
37 ## Champs → schéma 38 ## Champs → schéma
38 39
39−Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-10-14 18:40 EDT). 40+Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-10-27 13:42 EDT).
40 41
41 | Champ (`jobs.*`) | Rôle | Complétude | 42 | Champ (`jobs.*`) | Rôle | Complétude |
42 |---|---|---| 43 |---|---|---|
@@ -52,7 +53,7 @@ Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-
52 | `employment_type` — Type | temps_plein / temps_partiel / … | 100 % | 53 | `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % | 54 | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 | `salary_label` — Libellé salaire | texte salarial original | 0 % | 55 | `salary_label` — Libellé salaire | texte salarial original | 0 % |
55−| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % | 56+| `benefits` — Avantages | avantages sociaux publiés (JSON) | 50 % |
56 | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % | 57 | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 | `date_posted` — Date de parution | ISO 8601 | 100 % | 58 | `date_posted` — Date de parution | ISO 8601 | 100 % |
58 | `date_deadline` — Date limite | date limite pour postuler | 0 % | 59 | `date_deadline` — Date limite | date limite pour postuler | 0 % |
@@ -60,32 +61,32 @@ Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-
60 | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % | 61 | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % |
61 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % | 62 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % |
62 | `apply_url` — Candidature | lien de candidature directe | 0 % | 63 | `apply_url` — Candidature | lien de candidature directe | 0 % |
63−| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % | 64+| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
64 65
65−Exemple réel : *DEVELOPPEUR / ARCHITECTE - .NET* — Montréal · ∅ · parue le 2021-08-02. 66+Exemple réel : *Odoo Functional Analyst* — Montréal · ∅ · parue le 2026-01-29.
66 67
67 ## Fréquence & budgets 68 ## Fréquence & budgets
68 69
69 - **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources. 70 - **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
70−- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`). 71+- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
71 - **Budgets / plafonds (variables d'environnement)** : 72 - **Budgets / plafonds (variables d'environnement)** :
72 73
73 | Variable | Défaut | 74 | Variable | Défaut |
74 |---|---| 75 |---|---|
75−| `JOBKA_SR_DETAIL_LIMIT` | `300` | 76+| `JOBKA_ODOO_DETAIL_LIMIT` | `60` |
76 - Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change. 77 - Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
77 78
78 ## Volumétrie & complétude live 79 ## Volumétrie & complétude live
79 80
80−*(mesuré le 2026-10-14 18:40 EDT dans `data/jobka.db`)* 81+*(mesuré le 2026-10-27 13:42 EDT dans `data/jobka.db`)*
81 82
82−- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`) 83+- **Offres en base** : 3 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
83−- **Salaire** : 0/1 actives (0 %) 84+- **Salaire** : 0/2 actives (0 %)
84−- **GPS** : 1/1 actives (100 %) 85+- **GPS** : 0/2 actives (0 %)
85−- **Mode** : 1/1 actives (100 %) 86+- **Mode** : 2/2 actives (100 %)
86−- **Parution** : 1/1 actives (100 %) 87+- **Parution** : 2/2 actives (100 %)
87−- **Dernier sync** : 2026-10-14 15:23 — trouvées 1, +0, ~0, -0 88+- **Dernier sync** : 2026-10-27 13:42 — trouvées 2, +2, ~0, -0
88−- **Syncs enregistrés** (`sync_log`) : 486 89+- **Syncs enregistrés** (`sync_log`) : 603
89 90
90 ## Erreurs & dépannage 91 ## Erreurs & dépannage
91 92
modified jobka/connectors/ingeniuinc.py +14 −6
@@ -3,14 +3,22 @@
3 # Auteur : Simon-Pierre Boucher 3 # Auteur : Simon-Pierre Boucher
4 # Contact : contact@spboucher.ai 4 # Contact : contact@spboucher.ai
5 # Fichier : jobka/connectors/ingeniuinc.py 5 # Fichier : jobka/connectors/ingeniuinc.py
6−# Rôle : Connecteur Ingeniu inc. — smartrecruiters (org « IngeniuInc ») 6+# Rôle : Connecteur Ingeniu inc. — Odoo website_hr_recruitment sur
7−# [généré par scripts/gen_connectors.py, flux vérifié le 2026-08-23] 7+# www.ingeniusolutions.com (ex-SmartRecruiters « IngeniuInc »)
8−# Créé : 2026-08-23 Modifié : 2026-08-23 8+# Créé : 2026-08-23 Modifié : 2026-10-27
9 # ============================================================================= 9 # =============================================================================
10−from .smartrecruiters import SmartRecruitersConnector 10+"""Migration d'ATS constatée le 2026-10-27 (mission ka6) : le tenant
11+SmartRecruiters « IngeniuInc » a été VIDÉ (API postings 200 totalFound=0,
12+page board 404) — son unique offre, un fantôme paru le 2021-08-02, a été
13+dépubliée entre 07:32 et 10:23 EDT. L'entreprise s'est rebaptisée « Ingeniu
14+Solutions » (ingeniu.ca redirige vers www.ingeniusolutions.com) et publie
15+désormais ses offres sur son propre site Odoo (module recrutement, /jobs) :
16+2 offres au 2026-10-27, toutes deux avec marqueur Montréal explicite
17+(« à notre bureau de Montréal », « Située à Montréal »)."""
18+from .odoo import OdooConnector
11 19
12 20
13−class IngeniuincConnector(SmartRecruitersConnector): 21+class IngeniuincConnector(OdooConnector):
14 source_id = 'ingeniuinc' 22 source_id = 'ingeniuinc'
15 EMPLOYER = 'Ingeniu inc.' 23 EMPLOYER = 'Ingeniu inc.'
16− COMPANY = 'IngeniuInc' 24+ SITE = 'https://www.ingeniusolutions.com'
added jobka/connectors/odoo.py +217 −0
@@ -0,0 +1,217 @@
1+# =============================================================================
2+# Job·Ka — Groupe KA
3+# Auteur : Simon-Pierre Boucher
4+# Contact : contact@spboucher.ai
5+# Fichier : jobka/connectors/odoo.py
6+# Rôle : Classe de plateforme Odoo website_hr_recruitment — page /jobs
7+# rendue serveur + microdonnées schema.org/JobPosting des pages détail
8+# Créé : 2026-10-27 Modifié : 2026-10-27
9+# =============================================================================
10+"""Plateforme Odoo (module « website_hr_recruitment ») — page carrières
11+``/jobs`` hébergée sur le SITE de l'employeur (pas un domaine ATS partagé).
12+
13+- liste : GET <SITE>/jobs -> HTML rendu serveur (pas de SPA) : cartes dans
14+ le conteneur ``id="jobs_grid"``, chacune avec une ancre
15+ « /jobs/<slug>-<id numérique> », le titre dans le <h3> de la
16+ carte et un libellé de lieu libre dans le bloc <address>
17+ (« Remote », « Hybride (Bureau/Remote) », parfois une vraie
18+ adresse). Pagination Odoo « /jobs/page/N » suivie si présente.
19+- détail : GET <SITE>/jobs/<slug>-<id> -> MICRODONNÉES schema.org (pas de
20+ JSON-LD) dans le bloc ``itemscope itemtype=…/JobPosting`` :
21+ meta datePosted/employmentType/title, div itemprop="description".
22+ ⚠️ La div description ne porte souvent que l'INTRO : le corps de
23+ l'offre (responsabilités, compétences, avantages) vit dans les
24+ blocs « website builder » qui la suivent — la description capturée
25+ court de la div jusqu'au footer. Cache BD + budget de re-visites
26+ (JOBKA_ODOO_DETAIL_LIMIT).
27+- garde-fou : une vraie page liste porte toujours le conteneur
28+ ``jobs_grid`` (même board vide) — son absence = challenge/erreur, pas une
29+ liste vide : retry avec backoff puis erreur explicite plutôt qu'un faux
30+ « 0 offre » (même doctrine que glow/JazzHR).
31+- lieux : Odoo publie rarement une addressLocality structurée — le bloc
32+ <address> est souvent un libellé libre (« Remote »). Le pied de page du
33+ site porte l'adresse du siège, identique partout : tout ce qui suit
34+ ``<footer`` est IGNORÉ. Cascade de décision Québec (doctrine bento_sushi,
35+ rien d'inventé) : addressLocality des microdonnées si présente, sinon
36+ libellé <address> s'il porte ville/province QC, sinon ville citée dans le
37+ bloc JobPosting (« à notre bureau de Montréal », « Située à Montréal »,
38+ « région de Montréal ») validée contre le référentiel des municipalités
39+ QC — une offre sans aucun marqueur québécois est écartée.
40+"""
41+from __future__ import annotations
42+
43+import html as _html
44+import os
45+import re
46+
47+from ..normalize import clean_html, parse_employment_type, parse_work_mode
48+from ..regions import region_for_city
49+from ..schema import JobPosting, is_quebec_location
50+from .base import BaseConnector
51+
52+MAX_DETAILS = int(os.environ.get("JOBKA_ODOO_DETAIL_LIMIT", "60"))
53+MAX_PAGES = 20
54+
55+_LINK_RE = re.compile(r'href="(/jobs/[^"/?#]*-(\d+))"')
56+_H3_RE = re.compile(r"<h3[^>]*>(.*?)</h3>", re.S)
57+_ADDRESS_RE = re.compile(r"<address.*?</address>", re.S)
58+_META_RE = r'itemprop="%s"[^>]*\bcontent="([^"]*)"'
59+_LOCALITY_RE = re.compile(
60+ r'itemprop="addressLocality"[^>]*>([^<]+)<|' + _META_RE % "addressLocality")
61+_JOBPOSTING_RE = re.compile(r'<[^>]*itemtype="https?://schema\.org/JobPosting"')
62+_DESC_OPEN_RE = re.compile(r'<div[^>]*itemprop="description"[^>]*>')
63+# Ville citée dans le bloc JobPosting : « à notre bureau de Montréal »,
64+# « Située à Montréal », « région de Montréal ». Capture 1 à 3 mots
65+# capitalisés (traits d'union/apostrophes inclus) — chaque candidat est
66+# ensuite VALIDÉ contre le référentiel des municipalités QC
67+# (region_for_city), donc aucun faux lieu possible.
68+_CITY_RE = re.compile(
69+ r"(?:bureau(?:x)?\s+de|r[ée]gion\s+de|situ[ée]{1,2}\s+à|\bà)\s+"
70+ r"([A-ZÀ-ÿ][\w'’À-ÿ-]+(?:\s+[A-ZÀ-ÿ][\w'’À-ÿ-]+){0,2})")
71+
72+
73+def _text(markup: str) -> str:
74+ """Texte brut d'un fragment HTML (balises retirées, entités décodées)."""
75+ return re.sub(r"\s+", " ", _html.unescape(re.sub(r"<[^>]+>", " ",
76+ markup or ""))).strip()
77+
78+
79+def _city_from_text(text: str) -> str:
80+ """Première ville QC reconnue citée dans le texte, sinon ""."""
81+ for m in _CITY_RE.finditer(text or ""):
82+ words = m.group(1).split()
83+ # candidat le plus long d'abord (« Baie Comeau » avant « Baie »)
84+ for n in range(len(words), 0, -1):
85+ cand = " ".join(words[:n])
86+ if region_for_city(cand):
87+ return cand
88+ return ""
89+
90+
91+class OdooConnector(BaseConnector):
92+ """Base Odoo website_hr_recruitment — sous-classes : définir source_id,
93+ EMPLOYER, SITE (racine https du site employeur, sans / final)."""
94+
95+ ats = "odoo"
96+ request_delay = 1.0
97+
98+ EMPLOYER = ""
99+ SITE = "" # ex. https://www.ingeniusolutions.com
100+ JOBS_PATH = "/jobs"
101+ quebec_only = True
102+
103+ def _fetch_list_page(self, url: str) -> str:
104+ import time
105+ last = ""
106+ for attempt in range(3):
107+ resp = self.get(url)
108+ page = resp.text
109+ if "jobs_grid" in page:
110+ return page
111+ last = (f"HTTP {resp.status_code}, {len(page)} octets, "
112+ f"content-type {resp.headers.get('content-type')}")
113+ if attempt < 2:
114+ time.sleep(10 * (attempt + 1))
115+ raise RuntimeError(
116+ f"odoo {self.SITE}: page liste sans conteneur jobs_grid "
117+ f"après 3 essais ({last})")
118+
119+ def _fetch_detail(self, path: str) -> dict:
120+ page = self.get(f"{self.SITE}{path}").text
121+ m = _JOBPOSTING_RE.search(page)
122+ zone = page[m.start():] if m else page
123+ foot = zone.find("<footer")
124+ if foot > 0:
125+ zone = zone[:foot] # siège social en pied de page : jamais lu
126+ out: dict = {}
127+ for prop in ("datePosted", "employmentType"):
128+ mm = re.search(_META_RE % prop, zone)
129+ if mm and mm.group(1):
130+ out["date_posted" if prop == "datePosted"
131+ else "employment_label"] = mm.group(1)
132+ mm = _LOCALITY_RE.search(zone)
133+ if mm:
134+ out["city"] = _html.unescape(mm.group(1) or mm.group(2) or "").strip()
135+ mm = _DESC_OPEN_RE.search(zone)
136+ if mm:
137+ # la div itemprop="description" ne porte souvent que l'intro —
138+ # le corps de l'offre (responsabilités, compétences, avantages)
139+ # vit dans les blocs « website builder » qui la SUIVENT, jusqu'au
140+ # footer (déjà coupé) : tout prendre, CTA de candidature retiré
141+ body = zone[mm.end():]
142+ body = re.sub(r"Postuler\s+maintenant\s*!?", " ", body)
143+ out["description_html"] = body
144+ # texte d'entête (hors description) : mode/type/ville y sont affichés
145+ head = zone[:mm.start()] if mm else zone
146+ out["header_text"] = _text(head)[:2000]
147+ return out
148+
149+ def fetch(self) -> list[JobPosting]:
150+ url = f"{self.SITE}{self.JOBS_PATH}"
151+ pages, seen_pages = [self._fetch_list_page(url)], {url}
152+ for page in pages:
153+ if len(pages) >= MAX_PAGES:
154+ break
155+ for mm in re.finditer(r'href="(/jobs/page/\d+)"', page):
156+ nxt = f"{self.SITE}{mm.group(1)}"
157+ if nxt not in seen_pages:
158+ seen_pages.add(nxt)
159+ pages.append(self._fetch_list_page(nxt))
160+ out: list[JobPosting] = []
161+ details_used = 0
162+ seen: set[str] = set()
163+ for page in pages:
164+ matches = list(_LINK_RE.finditer(page))
165+ for i, m in enumerate(matches):
166+ path, jid = m.group(1), m.group(2)
167+ if jid in seen:
168+ continue
169+ seen.add(jid)
170+ # bloc de la carte = entre cette ancre et la suivante
171+ end = (matches[i + 1].start() if i + 1 < len(matches)
172+ else len(page))
173+ block = page[m.end():end]
174+ m_t = _H3_RE.search(block)
175+ title = _text(m_t.group(1)) if m_t else ""
176+ m_a = _ADDRESS_RE.search(block)
177+ label = _text(m_a.group(0)).strip("- ") if m_a else ""
178+ if details_used >= MAX_DETAILS:
179+ d = self.stale_detail(jid)
180+ if not d:
181+ continue # différée : ni détail frais ni cache
182+ else:
183+ fresh = [False]
184+
185+ def _fn(p=path, fresh=fresh):
186+ fresh[0] = True
187+ return self._fetch_detail(p)
188+
189+ d = self.detail(jid, f"{title}|{label}", _fn)
190+ if fresh[0]:
191+ details_used += 1
192+ head = d.get("header_text") or ""
193+ city = (d.get("city") or "").strip()
194+ if city and not region_for_city(city):
195+ city = "" # localité structurée hors référentiel QC
196+ if not city:
197+ city = _city_from_text(
198+ f"{head} {_text(d.get('description_html') or '')}")
199+ if self.quebec_only and not city and not (
200+ is_quebec_location(label)):
201+ continue # aucun marqueur québécois : écartée
202+ mode_src = f"{label} {head}"
203+ job = JobPosting(
204+ source=self.source_id, external_id=jid,
205+ url=f"{self.SITE}{path}",
206+ employer=self.EMPLOYER,
207+ title=title or _text(d.get("title") or ""),
208+ description=clean_html(d.get("description_html") or ""),
209+ city=city, location_label=label,
210+ work_mode=parse_work_mode(mode_src),
211+ employment_type=parse_employment_type(
212+ d.get("employment_label") or mode_src),
213+ date_posted=d.get("date_posted"),
214+ ats=self.ats,
215+ )
216+ out.append(job)
217+ return out
218
Menu

Theme