[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>
7 changed files +545 −243
modified
data/sources.json
+4 −4
@@ -8963,13 +8963,13 @@ | ||
| 8963 | 8963 | { |
| 8964 | 8964 | "id": "ingeniuinc", |
| 8965 | 8965 | "name": "Ingeniu inc.", |
| 8966 | − "url": "", | |
| 8967 | − "careers_url": "https://jobs.smartrecruiters.com/company/IngeniuInc", | |
| 8966 | + "url": "https://www.ingeniusolutions.com", | |
| 8967 | + "careers_url": "https://www.ingeniusolutions.com/jobs", | |
| 8968 | 8968 | "sectors": [ |
| 8969 | 8969 | "Ingénierie", |
| 8970 | 8970 | "Conseil" |
| 8971 | 8971 | ], |
| 8972 | − "connector": "smartrecruiters", | |
| 8972 | + "connector": "odoo", | |
| 8973 | 8973 | "status": "actif", |
| 8974 | 8974 | "region": "Montréal" |
| 8975 | 8975 | }, |
@@ -13680,4 +13680,4 @@ | ||
| 13680 | 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 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/INDEX.md |
| 7 | 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 | 9 | relancer le script pour régénérer. |
| 10 | 10 | ============================================================================= |
| 11 | 11 | --> |
| 12 | 12 | |
| 13 | 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 | 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 | 23 | | Plateforme | Employeurs | Actives | Salaire | GPS | |
| 24 | 24 | |---|---|---|---|---| |
| 25 | −| [`workday`](ats-workday.md) | 232 | 7510 | 48 % | 87 % | | |
| 26 | −| [`smartrecruiters`](ats-smartrecruiters.md) | 172 | 2868 | 16 % | 99 % | | |
| 27 | −| [`workable`](ats-workable.md) | 71 | 2015 | 18 % | 100 % | | |
| 28 | −| [`dayforce`](ats-dayforce.md) | 129 | 1985 | 9 % | 100 % | | |
| 29 | −| [`successfactors`](ats-successfactors.md) | 12 | 1683 | 18 % | 99 % | | |
| 25 | +| [`workday`](ats-workday.md) | 232 | 7516 | 48 % | 87 % | | |
| 26 | +| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2865 | 15 % | 99 % | | |
| 27 | +| [`workable`](ats-workable.md) | 71 | 2016 | 18 % | 100 % | | |
| 28 | +| [`dayforce`](ats-dayforce.md) | 129 | 1983 | 9 % | 100 % | | |
| 29 | +| [`successfactors`](ats-successfactors.md) | 12 | 1668 | 18 % | 99 % | | |
| 30 | 30 | | [`njoyn`](ats-njoyn.md) | 11 | 1253 | 70 % | 87 % | |
| 31 | −| [`workland`](ats-workland.md) | 1 | 1154 | 37 % | 100 % | | |
| 32 | −| [`greenhouse`](ats-greenhouse.md) | 132 | 814 | 18 % | 99 % | | |
| 31 | +| [`workland`](ats-workland.md) | 1 | 1156 | 36 % | 100 % | | |
| 32 | +| [`greenhouse`](ats-greenhouse.md) | 132 | 812 | 18 % | 99 % | | |
| 33 | 33 | | [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 807 | 6 % | 100 % | |
| 34 | −| [`lever`](ats-lever.md) | 58 | 611 | 21 % | 95 % | | |
| 35 | −| [`breezy`](ats-breezy.md) | 71 | 427 | 38 % | 94 % | | |
| 34 | +| [`lever`](ats-lever.md) | 58 | 609 | 21 % | 95 % | | |
| 35 | +| [`breezy`](ats-breezy.md) | 71 | 426 | 38 % | 94 % | | |
| 36 | 36 | | [`ashby`](ats-ashby.md) | 41 | 293 | 53 % | 58 % | |
| 37 | 37 | | [`recruitee`](ats-recruitee.md) | 30 | 285 | 20 % | 97 % | |
| 38 | 38 | | [`bamboohr`](ats-bamboohr.md) | 37 | 278 | 8 % | 100 % | |
@@ -40,14 +40,15 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 40 | 40 | | [`teamtailor`](ats-teamtailor.md) | 10 | 158 | 28 % | 96 % | |
| 41 | 41 | | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 145 | 14 % | 86 % | |
| 42 | 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 | 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 | 46 | | [`icims`](ats-icims.md) | 7 | 53 | 28 % | 96 % | |
| 47 | 47 | | [`ultipro`](ats-ultipro.md) | 4 | 48 | 52 % | 100 % | |
| 48 | 48 | | [`digitalrecruiters`](ats-digitalrecruiters.md) | 2 | 36 | 83 % | 100 % | |
| 49 | 49 | | [`custom`](ats-custom.md) | 1 | 32 | 38 % | 91 % | |
| 50 | 50 | | [`glow`](ats-glow.md) | 1 | 9 | 44 % | 0 % | |
| 51 | +| [`odoo`](ats-odoo.md) | 1 | 2 | 0 % | 0 % | | |
| 51 | 52 | |
| 52 | 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 | 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 | 67 | | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 1003 | 70 % | 68 % | ✅ | |
| 67 | 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 | 70 | | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 917 | 98 % | 89 % | ✅ | |
| 70 | 71 | | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 818 | 98 % | 98 % | ✅ | |
| 71 | 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 | 76 | | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 263 | 17 % | 96 % | ✅ | |
| 76 | 77 | | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 263 | 10 % | 95 % | ✅ | |
| 77 | 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 | 80 | | [Rechercher des](gianttiger.md) | [`workday`](ats-workday.md) | 239 | 0 % | 100 % | ✅ | |
| 80 | 81 | | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 234 | 0 % | 83 % | ✅ | |
| 81 | 82 | | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 209 | 4 % | 98 % | ✅ | |
| 82 | 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 | 85 | | [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 199 | 94 % | 96 % | ✅ | |
| 85 | 86 | | [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 179 | 3 % | 100 % | ✅ | |
| 86 | 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 | 94 | | [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 130 | 6 % | 100 % | ✅ | |
| 94 | 95 | | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 127 | 98 % | 100 % | ✅ | |
| 95 | 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 | 98 | | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 106 | 0 % | 100 % | ✅ | |
| 98 | 99 | | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 105 | 15 % | 100 % | ✅ | |
| 99 | 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 | 102 | | [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 102 | 7 % | 100 % | ✅ | |
| 102 | 103 | | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 100 | 9 % | 100 % | ✅ | |
| 103 | 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 | 106 | | [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 95 | 1 % | 81 % | ✅ | |
| 106 | 107 | | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 94 | 0 % | 99 % | ✅ | |
| 107 | 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 | 112 | | [Linen Chest](linenchest.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 84 | 8 % | 100 % | ✅ | |
| 112 | 113 | | [Gflenv](gflenv.md) | [`workday`](ats-workday.md) | 83 | 5 % | 84 % | ✅ | |
| 113 | 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 | 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 | 118 | | [MaintainX](maintainx.md) | [`ashby`](ats-ashby.md) | 70 | 93 % | 76 % | ✅ | |
| 118 | 119 | | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 67 | 0 % | 97 % | ✅ | |
| 119 | 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 | 135 | | [Agropur](agropur.md) | [`workday`](ats-workday.md) | 57 | 95 % | 96 % | ✅ | |
| 135 | 136 | | [Automobileendirect](automobileendirect.md) | [`dayforce`](ats-dayforce.md) | 57 | 2 % | 100 % | ✅ | |
| 136 | 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 | 139 | | [Agnico Eagle Mines](agnico_eagle.md) | [`taleo`](ats-taleo.md) | 54 | 0 % | 100 % | ✅ | |
| 139 | 140 | | [Kruger](kruger.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 53 | 9 % | 100 % | ✅ | |
| 140 | 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 | 156 | | [Unoria](unoria.md) | [`dayforce`](ats-dayforce.md) | 45 | 0 % | 100 % | ✅ | |
| 156 | 157 | | [Alterra](alterra.md) | [`workday`](ats-workday.md) | 44 | 68 % | 98 % | ✅ | |
| 157 | 158 | | [Bdo](bdo.md) | [`workday`](ats-workday.md) | 44 | 7 % | 70 % | ✅ | |
| 159 | +| [Beneva](beneva.md) | [`workday`](ats-workday.md) | 44 | 2 % | 100 % | ✅ | | |
| 158 | 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 | 161 | | [Camions Excellence Peterbilt](excellencepeterbilt.md) | [`dayforce`](ats-dayforce.md) | 43 | 37 % | 100 % | ✅ | |
| 162 | 162 | | [JD Sports Canada](jdsports.md) | [`dayforce`](ats-dayforce.md) | 43 | 0 % | 100 % | ✅ | |
| 163 | 163 | | [Levio](levio.md) | [`greenhouse`](ats-greenhouse.md) | 43 | 0 % | 100 % | ✅ | |
| 164 | 164 | | [Rio Tinto](riotinto.md) | [`workday`](ats-workday.md) | 43 | 0 % | 98 % | ✅ | |
| 165 | 165 | | [Saputo](saputo.md) | [`workday`](ats-workday.md) | 43 | 81 % | 100 % | ✅ | |
| 166 | +| [Brand Momentum](brandmomentum.md) | [`breezy`](ats-breezy.md) | 42 | 95 % | 95 % | ✅ | | |
| 166 | 167 | | [Investissements PSP](investpsp.md) | [`workday`](ats-workday.md) | 42 | 2 % | 100 % | ✅ | |
| 167 | 168 | | [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 42 | 7 % | 100 % | ✅ | |
| 168 | 169 | | [Groupe CH (Canadiens de Montréal, Centre Bell)](groupech.md) | [`dayforce`](ats-dayforce.md) | 41 | 0 % | 100 % | ✅ | |
| 169 | 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 | 172 | | [Cohere](cohere.md) | [`ashby`](ats-ashby.md) | 38 | 92 % | 26 % | ✅ | |
| 171 | 173 | | [exo (transport métropolitain)](exo.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 38 | 0 % | 89 % | ✅ | |
| 172 | 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 | 179 | | [Kenworthmaska](kenworthmaska.md) | [`dayforce`](ats-dayforce.md) | 37 | 3 % | 100 % | ✅ | |
| 178 | 180 | | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 37 | 5 % | 97 % | ✅ | |
| 179 | 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 | 182 | | [EXFO](exfo.md) | [`workday`](ats-workday.md) | 35 | 0 % | 97 % | ✅ | |
| 183 | +| [Abinbev](abinbev.md) | [`workday`](ats-workday.md) | 34 | 100 % | 97 % | ✅ | | |
| 182 | 184 | | [KABS](kabs.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 0 % | 100 % | ✅ | |
| 183 | 185 | | [OPENLANE Canada](openlane.md) | [`workday`](ats-workday.md) | 34 | 21 % | 88 % | ✅ | |
| 184 | 186 | | [QSL](qsl.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 34 | 29 % | 100 % | ✅ | |
| 185 | 187 | | [Rollsroyce](rollsroyce.md) | [`workday`](ats-workday.md) | 34 | 0 % | 100 % | ✅ | |
| 186 | −| [Abinbev](abinbev.md) | [`workday`](ats-workday.md) | 33 | 100 % | 100 % | ✅ | | |
| 187 | 188 | | [Advanceauto](advanceauto.md) | [`workday`](ats-workday.md) | 33 | 0 % | 36 % | ✅ | |
| 188 | 189 | | [Domtar](domtar.md) | [`successfactors`](ats-successfactors.md) | 33 | 12 % | 100 % | ✅ | |
| 189 | 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 | 203 | | [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 29 | 0 % | 100 % | ✅ | |
| 203 | 204 | | [Lgs](lgs.md) | [`dayforce`](ats-dayforce.md) | 29 | 0 % | 100 % | ✅ | |
| 204 | 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 | 206 | | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 28 | 0 % | 36 % | ✅ | |
| 207 | 207 | | [Ms](ms.md) | [`workday`](ats-workday.md) | 28 | 0 % | 100 % | ✅ | |
| 208 | −| [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 27 | 0 % | 100 % | ✅ | | |
| 209 | 208 | | [Rodeo FX](rodeofx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 93 % | ✅ | |
| 210 | 209 | | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 27 | 0 % | 100 % | ✅ | |
| 211 | 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 | 218 | | [RM Staffing B.V.](rebootmonkey.md) | [`recruitee`](ats-recruitee.md) | 26 | 85 % | 100 % | ✅ | |
| 220 | 219 | | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 92 % | ✅ | |
| 221 | 220 | | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 25 | 100 % | 0 % | ✅ | |
| 221 | +| [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 25 | 0 % | 100 % | ✅ | | |
| 222 | 222 | | [Clinical Research Associate](syneoshealth.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ | |
| 223 | 223 | | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ | |
| 224 | 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 | 240 | | [Soprema](soprema.md) | [`dayforce`](ats-dayforce.md) | 23 | 13 % | 100 % | ✅ | |
| 241 | 241 | | [Tmx](tmx.md) | [`workday`](ats-workday.md) | 23 | 0 % | 83 % | ✅ | |
| 242 | 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 | 244 | | [Baro RH](barorh.md) | [`workable`](ats-workable.md) | 22 | 0 % | 100 % | ✅ | |
| 244 | 245 | | [Canada Vie](canada_vie.md) | [`successfactors`](ats-successfactors.md) | 22 | 95 % | 86 % | ✅ | |
| 245 | 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 | 518 | | [Altitude Sports](altitude_sports.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 7 | 14 % | 100 % | ✅ | |
| 518 | 519 | | [Alveole](alveole.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 100 % | 100 % | ✅ | |
| 519 | 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 | 521 | | [Big Bang](bigbang.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 29 % | 100 % | ✅ | |
| 522 | 522 | | [Boart Longyear](bly.md) | [`dayforce`](ats-dayforce.md) | 7 | 100 % | 100 % | ✅ | |
| 523 | 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 | 549 | | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ | |
| 550 | 550 | | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 7 | 14 % | 100 % | ✅ | |
| 551 | 551 | | [Trigyn Technologies](trigyntechnologies1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 0 % | 100 % | ✅ | |
| 552 | +| [Abritek](abritek.md) | [`adp`](ats-adp.md) | 6 | 100 % | 83 % | ✅ | | |
| 552 | 553 | | [Accedian Networks](accediannetworks.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | |
| 553 | 554 | | [Alimentiv](alimentiv_2.md) | [`lever`](ats-lever.md) | 6 | 100 % | 0 % | ✅ | |
| 554 | 555 | | [Alo Yoga](aloyoga.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 50 % | 67 % | ✅ | |
| 555 | 556 | | [Also Recrutement - Carrière](alsorecrutement.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 17 % | 50 % | ✅ | |
| 556 | 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 | 559 | | [Bdx](bdx.md) | [`workday`](ats-workday.md) | 6 | 17 % | 83 % | ✅ | |
| 558 | 560 | | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | |
| 559 | 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 | 583 | | [MSI Gestion immobilière](msi_gestion.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ | |
| 582 | 584 | | [Nexapp](nexapp.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | |
| 583 | 585 | | [Nomic Bio](nomic.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 83 % | ✅ | |
| 586 | +| [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 6 | 17 % | 83 % | ✅ | | |
| 584 | 587 | | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ | |
| 585 | 588 | | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | |
| 586 | 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 | 597 | | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ | |
| 595 | 598 | | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | |
| 596 | 599 | | [36Pix](pix36.md) | [`jazzhr`](ats-jazzhr.md) | 5 | 20 % | 100 % | ✅ | |
| 597 | −| [Abritek](abritek.md) | [`adp`](ats-adp.md) | 5 | 100 % | 100 % | ✅ | | |
| 598 | 600 | | [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ | |
| 599 | 601 | | [Agile DSS](agiledss.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ | |
| 600 | 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 | 615 | | [Ecosystem Énergie](ecosystem.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | |
| 614 | 616 | | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ | |
| 615 | 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 | 618 | | [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 100 % | ✅ | |
| 618 | 619 | | [Ggi](ggi.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ | |
| 619 | 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 | 634 | | [MVV](mvv1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 5 | 0 % | 100 % | ✅ | |
| 634 | 635 | | [Médialo](medialo.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 80 % | ✅ | |
| 635 | 636 | | [Nrfcanada](nrfcanada.md) | [`workday`](ats-workday.md) | 5 | 40 % | 60 % | ✅ | |
| 636 | −| [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 5 | 20 % | 100 % | ✅ | | |
| 637 | 637 | | [Omni Hôtel Mont-Royal](omni_hotels_gestion.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ | |
| 638 | 638 | | [Omni Hôtel Mont-Royal](omni_hotels_horaire.md) | [`icims`](ats-icims.md) | 5 | 20 % | 100 % | ✅ | |
| 639 | 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 | 652 | | [AutoTrader Canada](autotradercanada.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 100 % | 100 % | ✅ | |
| 653 | 653 | | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 4 | 0 % | 100 % | ✅ | |
| 654 | 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 | 655 | | [Boreala Management](borealamanagement.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | |
| 657 | 656 | | [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 4 | 0 % | 100 % | ✅ | |
| 658 | 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 | 669 | | [Fellow Insights Inc.](fellowai.md) | [`ashby`](ats-ashby.md) | 4 | 0 % | 0 % | ✅ | |
| 671 | 670 | | [Flatgigs](flatgigs.md) | [`workable`](ats-workable.md) | 4 | 0 % | 100 % | ✅ | |
| 672 | 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 | 673 | | [Fortigo Freight Services Inc.](fortigofreightservicesinc.md) | [`jazzhr`](ats-jazzhr.md) | 4 | 25 % | 50 % | ✅ | |
| 674 | 674 | | [GAME DESIGN AND VIDEO GAME LEVEL](lci.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | |
| 675 | 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 | 693 | | [Nmédia](nmdia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | |
| 694 | 694 | | [Norbert Health](norbert_health.md) | [`breezy`](ats-breezy.md) | 4 | 0 % | 100 % | ✅ | |
| 695 | 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 | 697 | | [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | |
| 697 | 698 | | [Outpost VFX](outpostvfx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | |
| 698 | 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 | 722 | | [AON3D](aon3d_fr.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | |
| 722 | 723 | | [AstenJohnson](ajholdingsltd.md) | [`dayforce`](ats-dayforce.md) | 3 | 100 % | 100 % | ✅ | |
| 723 | 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 | 726 | | [BDC](bdc.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ | |
| 725 | 727 | | [BETA Technologies](betatechnologiesinc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 67 % | 100 % | ✅ | |
| 726 | 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 | 769 | | [Modern Menopause](modernmenopause.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | |
| 768 | 770 | | [MXO](mxo.md) | [`bamboohr`](ats-bamboohr.md) | 3 | 67 % | 100 % | ✅ | |
| 769 | 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 | 772 | | [Oboxmedia](oboxmedia1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 3 | 0 % | 100 % | ✅ | |
| 772 | 773 | | [Opportunities with AppDirect's Advisor Partners (Recruitment as a Service)](appdirectraas.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | |
| 773 | 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 | 837 | | [Granit Design](granit_design.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ | |
| 837 | 838 | | [Groupe BC2](bc2.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ | |
| 838 | 839 | | [HP](hp.md) | [`workday`](ats-workday.md) | 2 | 100 % | 100 % | ✅ | |
| 840 | +| [Ingeniu inc.](ingeniuinc.md) | [`odoo`](ats-odoo.md) | 2 | 0 % | 0 % | ✅ | | |
| 839 | 841 | | [Jj](jj.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ | |
| 840 | 842 | | [Kiongroup](kiongroup.md) | [`workday`](ats-workday.md) | 2 | 50 % | 50 % | ✅ | |
| 841 | 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 | 1094 | | [Imerys](imerys.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ | |
| 1093 | 1095 | | [Industrial Electric Manufacturing](industrialelectricmanufacturing.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ | |
| 1094 | 1096 | | [Industrious](industrious.md) | [`ashby`](ats-ashby.md) | 0 | — | — | ✅ | |
| 1095 | −| [Ingeniu inc.](ingeniuinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ | | |
| 1096 | 1097 | | [Insite Property Solutions](insite_property_solutions.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ | |
| 1097 | 1098 | | [Insomnia Cookies](insomniacookies.md) | [`lever`](ats-lever.md) | 0 | — | — | ✅ | |
| 1098 | 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 | 4 | Auteur : Simon-Pierre Boucher |
| 5 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/ats-smartrecruiters.md |
| 7 | −Rôle : Fiche plateforme ATS smartrecruiters — mécanique partagée + tableau des 172 tenants | |
| 8 | −Généré : 2026-10-26 18:17 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 7 | +Rôle : Fiche plateforme ATS smartrecruiters — mécanique partagée + tableau des 171 tenants | |
| 8 | +Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 9 | 9 | relancer le script pour régénérer. |
| 10 | 10 | ============================================================================= |
| 11 | 11 | --> |
| 12 | 12 | |
| 13 | 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 | 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 | 42 | | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK | |
| 43 | 43 | |---|---|---|---|---|---|---| |
| 44 | −| [CIMA+](cima2.md) | 260 | 1 % | 100 % | 90 % | 2026-10-26 18:05 | ✅ | | |
| 45 | −| [Reitmans](reitmanscanadalteltd.md) | 213 | 17 % | 100 % | 31 % | 2026-10-26 15:33 | ✅ | | |
| 46 | −| [American Iron and Metal](americanironandmetal.md) | 203 | 22 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | | |
| 47 | −| [Sodexo Canada](sodexocanadaltd.md) | 146 | 83 % | 99 % | 6 % | 2026-10-26 15:38 | ✅ | | |
| 48 | −| [Ubisoft](ubisoft.md) | 139 | 0 % | 100 % | 1 % | 2026-10-26 15:44 | ✅ | | |
| 49 | −| [Vidéotron](videotron.md) | 108 | 6 % | 100 % | 42 % | 2026-10-26 15:46 | ✅ | | |
| 50 | −| [Artelia Canada](artelia.md) | 106 | 0 % | 100 % | 24 % | 2026-10-26 17:52 | ✅ | | |
| 51 | −| [Groupe Helios](groupehelios.md) | 104 | 2 % | 100 % | 2 % | 2026-10-26 17:28 | ✅ | | |
| 52 | −| [UAP Inc.](uapinc.md) | 88 | 43 % | 98 % | 32 % | 2026-10-26 15:44 | ✅ | | |
| 53 | −| [Linen Chest](linenchest.md) | 84 | 8 % | 100 % | 6 % | 2026-10-26 15:15 | ✅ | | |
| 54 | −| [Renaud-Bray](renaud_bray.md) | 82 | 1 % | 100 % | 1 % | 2026-10-26 15:33 | ✅ | | |
| 55 | −| [EMCO](emcocorporation.md) | 64 | 39 % | 100 % | 6 % | 2026-10-26 18:13 | ✅ | | |
| 56 | −| [Dexterra](dexterra.md) | 62 | 0 % | 100 % | 11 % | 2026-10-26 18:10 | ✅ | | |
| 57 | −| [Groupe Canam](groupecanam.md) | 53 | 72 % | 98 % | 28 % | 2026-10-26 17:28 | ✅ | | |
| 58 | −| [Techo-Bloc](techo_bloc.md) | 46 | 39 % | 100 % | 30 % | 2026-10-26 15:41 | ✅ | | |
| 59 | −| [Info-Ways](info_ways.md) | 39 | 0 % | 100 % | 8 % | 2026-10-26 17:40 | ✅ | | |
| 60 | −| [Sopra Steria](soprasteria1.md) | 38 | 0 % | 100 % | 84 % | 2026-10-26 15:39 | ✅ | | |
| 61 | −| [system canada technologies](systemcanadatechnologies.md) | 38 | 0 % | 100 % | 0 % | 2026-10-26 15:40 | ✅ | | |
| 62 | −| [KABS](kabs.md) | 36 | 0 % | 100 % | 3 % | 2026-10-26 15:12 | ✅ | | |
| 63 | −| [QSL](qsl.md) | 35 | 29 % | 100 % | 6 % | 2026-10-26 15:32 | ✅ | | |
| 64 | −| [Rodeo FX](rodeofx.md) | 31 | 0 % | 94 % | 10 % | 2026-10-26 15:34 | ✅ | | |
| 65 | −| [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | 29 | 0 % | 100 % | 76 % | 2026-10-26 15:15 | ✅ | | |
| 66 | −| [AccorHotel](accorhotel.md) | 28 | 61 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | | |
| 67 | −| [Structube](structube1.md) | 27 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 68 | −| [AbbVie](abbvie.md) | 26 | 0 % | 100 % | 92 % | 2026-10-26 17:48 | ✅ | | |
| 69 | −| [Transat A.T.](transatat1.md) | 25 | 8 % | 100 % | 36 % | 2026-10-26 15:43 | ✅ | | |
| 70 | −| [Wabtec](wabtec.md) | 25 | 16 % | 100 % | 36 % | 2026-10-26 15:46 | ✅ | | |
| 71 | −| [MEDFAR Solutions Cliniques](medfar.md) | 24 | 0 % | 100 % | 92 % | 2026-10-26 15:18 | ✅ | | |
| 72 | −| [Spectrum Health Care](spectrumhealthcare.md) | 22 | 95 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 73 | −| [ATIA Ltd](atialtd.md) | 21 | 38 % | 100 % | 0 % | 2026-10-26 17:53 | ✅ | | |
| 74 | −| [Distribution stox](distributionstox2.md) | 20 | 25 % | 100 % | 50 % | 2026-10-26 18:10 | ✅ | | |
| 75 | −| [NBCUniversal](nbcuniversal3.md) | 20 | 0 % | 100 % | 85 % | 2026-10-26 15:26 | ✅ | | |
| 76 | −| [Sia](sia.md) | 20 | 0 % | 100 % | 30 % | 2026-10-26 15:37 | ✅ | | |
| 77 | −| [Vosker](vosker.md) | 19 | 0 % | 100 % | 89 % | 2026-10-26 15:46 | ✅ | | |
| 78 | −| [Sika Canada](sikaag.md) | 19 | 5 % | 100 % | 16 % | 2026-10-26 15:37 | ✅ | | |
| 79 | −| [Scalian](scalian.md) | 19 | 16 % | 100 % | 100 % | 2026-10-26 15:36 | ✅ | | |
| 80 | −| [H&M](hmgroup.md) | 18 | 0 % | 100 % | 0 % | 2026-10-26 17:38 | ✅ | | |
| 81 | −| [REXEL](rexel1.md) | 18 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | | |
| 82 | −| [Egis Group](egisgroup.md) | 16 | 0 % | 100 % | 25 % | 2026-10-26 18:13 | ✅ | | |
| 83 | −| [AECOM](aecom2.md) | 15 | 0 % | 100 % | 80 % | 2026-10-26 17:50 | ✅ | | |
| 84 | −| [Frima Studio](frimastudio.md) | 15 | 0 % | 100 % | 93 % | 2026-10-26 17:24 | ✅ | | |
| 85 | −| [Renovco](renovco.md) | 14 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | | |
| 86 | −| [Gameloft](gameloft.md) | 13 | 0 % | 100 % | 69 % | 2026-10-26 17:24 | ✅ | | |
| 87 | −| [Lemay](lemay.md) | 13 | 8 % | 100 % | 69 % | 2026-10-26 15:15 | ✅ | | |
| 88 | −| [Groupe Montoni](groupemontoni.md) | 13 | 0 % | 100 % | 15 % | 2026-10-26 17:28 | ✅ | | |
| 89 | −| [Relais & Châteaux](relaischateaux.md) | 13 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | | |
| 90 | −| [Talan](talan.md) | 12 | 0 % | 100 % | 83 % | 2026-10-26 15:40 | ✅ | | |
| 91 | −| [McWane Canada](mcwanecanada.md) | 12 | 58 % | 100 % | 0 % | 2026-10-26 15:18 | ✅ | | |
| 92 | −| [Indigo Books & Music](indigobooksmusic.md) | 11 | 0 % | 100 % | 0 % | 2026-10-26 17:40 | ✅ | | |
| 93 | −| [Oliver & Bonacini](oliverbonacini.md) | 11 | 27 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | | |
| 94 | −| [Mattel (Mega Bloks)](mattelinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 95 | −| [Airlab Inc.](airlabinc.md) | 10 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | | |
| 96 | −| [R&D Partners](rdpartners1.md) | 10 | 0 % | 100 % | 80 % | 2026-10-26 15:32 | ✅ | | |
| 97 | −| [J'Excelle](jexcelleinc.md) | 9 | 0 % | 100 % | 11 % | 2026-10-26 17:42 | ✅ | | |
| 98 | −| [act digital](altersolutions.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | | |
| 99 | −| [LGT](lgt1.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | | |
| 100 | −| [Manitoulin Group of Companies](manitoulingroupofcompanies.md) | 9 | 56 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 101 | −| [Utask](utask.md) | 9 | 0 % | 100 % | 0 % | 2026-10-26 15:45 | ✅ | | |
| 102 | −| [CF Montréal](cfmontreal.md) | 8 | 0 % | 75 % | 0 % | 2026-10-26 18:03 | ✅ | | |
| 103 | −| [People Can Fly](peoplecanfly.md) | 8 | 0 % | 100 % | 100 % | 2026-10-26 15:28 | ✅ | | |
| 104 | −| [Canadian Helicopters](canadianhelicopters.md) | 8 | 0 % | 100 % | 0 % | 2026-10-26 17:57 | ✅ | | |
| 105 | −| [Expresco Foods](exprescofoods.md) | 8 | 12 % | 100 % | 0 % | 2026-10-26 18:16 | ✅ | | |
| 106 | −| [JYSK Canada](jyskcanada.md) | 8 | 0 % | 100 % | 0 % | 2026-10-26 15:12 | ✅ | | |
| 107 | −| [Turner & Townsend](turnertownsend.md) | 8 | 25 % | 100 % | 75 % | 2026-10-26 15:44 | ✅ | | |
| 108 | −| [MalOPlus Group Inc.](maloplusteleservices1.md) | 8 | 0 % | 100 % | 88 % | 2026-10-26 15:16 | ✅ | | |
| 109 | −| [ISAAC Instruments](isaacinstruments.md) | 8 | 0 % | 100 % | 75 % | 2026-10-26 17:42 | ✅ | | |
| 110 | −| [MalOPlus Group](maloplusteleservices.md) | 8 | 0 % | 0 % | 100 % | 2026-10-26 15:16 | ✅ | | |
| 111 | −| [1perTInent inc](x1pertinentinc.md) | 7 | 0 % | 100 % | 71 % | 2026-10-26 15:49 | ✅ | | |
| 112 | −| [Chagall Design](chagalldesign.md) | 7 | 0 % | 100 % | 0 % | 2026-10-26 18:04 | ✅ | | |
| 113 | −| [Hydrogen Research Institute](hydrogenresearchinstitute.md) | 7 | 14 % | 100 % | 0 % | 2026-10-26 17:39 | ✅ | | |
| 114 | −| [Trigyn Technologies](trigyntechnologies1.md) | 7 | 0 % | 100 % | 0 % | 2026-10-26 15:43 | ✅ | | |
| 115 | −| [Innovation RH inc.](innovationrh.md) | 7 | 14 % | 100 % | 29 % | 2026-10-26 17:41 | ✅ | | |
| 116 | −| [ServiceNow](servicenow.md) | 6 | 0 % | 100 % | 83 % | 2026-10-26 15:36 | ✅ | | |
| 117 | −| [Accedian Networks](accediannetworks.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 17:48 | ✅ | | |
| 118 | −| [Léger](leger2.md) | 6 | 33 % | 100 % | 100 % | 2026-10-26 15:15 | ✅ | | |
| 119 | −| [Right Talent Right Now](righttalentrightnow.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 15:33 | ✅ | | |
| 120 | −| [Yaksa](yaksa.md) | 6 | 0 % | 100 % | 0 % | 2026-10-26 15:50 | ✅ | | |
| 121 | −| [Astucemedia](astucemedia.md) | 5 | 0 % | 100 % | 60 % | 2026-10-26 17:52 | ✅ | | |
| 122 | −| [Cornerstone Building Brands](cornerstonebuildingbrandscareers.md) | 5 | 40 % | 100 % | 20 % | 2026-10-26 18:09 | ✅ | | |
| 123 | −| [MVV](mvv1.md) | 5 | 0 % | 100 % | 60 % | 2026-10-26 15:25 | ✅ | | |
| 124 | −| [HoYoverse](hoyoverse.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 17:38 | ✅ | | |
| 125 | −| [GURU Boisson Énergisante](guruorganicenergydrink.md) | 4 | 0 % | 100 % | 75 % | 2026-10-26 17:35 | ✅ | | |
| 126 | −| [Acumatica](acumatica.md) | 4 | 25 % | 100 % | 100 % | 2026-10-26 17:49 | ✅ | | |
| 127 | −| [Boreala Management](borealamanagement.md) | 4 | 0 % | 100 % | 50 % | 2026-10-26 17:56 | ✅ | | |
| 128 | −| [Chewi Creative](chewicreative.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 18:05 | ✅ | | |
| 129 | −| [Continental Group Sector ContiTech](continentalgroupsectorcontitech.md) | 4 | 25 % | 100 % | 25 % | 2026-10-26 18:08 | ✅ | | |
| 130 | −| [Ensiti](ensiti.md) | 4 | 0 % | 100 % | 75 % | 2026-10-26 18:13 | ✅ | | |
| 131 | −| [Groupe Beaudry](groupebeaudry.md) | 4 | 25 % | 100 % | 0 % | 2026-10-26 17:28 | ✅ | | |
| 132 | −| [Luckyhammers](luckyhammers.md) | 4 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 133 | −| [META4](meta4.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:20 | ✅ | | |
| 134 | −| [Nmédia](nmdia.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:26 | ✅ | | |
| 135 | −| [O-I](o_i.md) | 4 | 25 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | | |
| 136 | −| [OTIP Group of Companies (OGC)](otipgroupofcompaniesogc.md) | 4 | 0 % | 100 % | 100 % | 2026-10-26 15:28 | ✅ | | |
| 137 | −| [Outpost VFX](outpostvfx.md) | 4 | 0 % | 100 % | 25 % | 2026-10-26 15:28 | ✅ | | |
| 138 | −| [Prelib](prelib.md) | 4 | 75 % | 100 % | 50 % | 2026-10-26 15:28 | ✅ | | |
| 139 | −| [Pyrotek](pyrotek3.md) | 4 | 75 % | 100 % | 0 % | 2026-10-26 15:32 | ✅ | | |
| 140 | −| [Trigone](trigone.md) | 4 | 0 % | 100 % | 0 % | 2026-10-26 15:43 | ✅ | | |
| 141 | −| [Agence Maplr Inc.](agencemaplrinc.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | | |
| 142 | −| [Continental Technology Solutions](continentaltechnologysolutions.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 18:08 | ✅ | | |
| 143 | −| [Cygnus Professionals Inc](cygnusprofessionalsinc2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 18:09 | ✅ | | |
| 144 | −| [Dev](dev2.md) | 3 | 100 % | 100 % | 33 % | 2026-10-26 18:10 | ✅ | | |
| 145 | −| [Gentek Building Products Ltd Partnership](gentekbuildingproductsltdpartner.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 17:25 | ✅ | | |
| 146 | −| [Intersand](intersand.md) | 3 | 0 % | 100 % | 33 % | 2026-10-26 17:41 | ✅ | | |
| 147 | −| [Keyrus](keyrus2.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:13 | ✅ | | |
| 148 | −| [Mannarino Systems & Software Inc.](mannarinosystemssoftwareinc.md) | 3 | 0 % | 100 % | 33 % | 2026-10-26 15:16 | ✅ | | |
| 149 | −| [Mecar Métal](mecarmtal.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:18 | ✅ | | |
| 150 | −| [Naisense Solutions Inc](naisensesolutionsinc.md) | 3 | 0 % | 100 % | 100 % | 2026-10-26 15:26 | ✅ | | |
| 151 | −| [Oboxmedia](oboxmedia1.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | | |
| 152 | −| [A2 Design](a2design.md) | 3 | 0 % | 100 % | 100 % | 2026-10-26 17:48 | ✅ | | |
| 153 | −| [LE CAFÉ DES ARTISTES](lecafdesartistes.md) | 3 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | | |
| 154 | −| [Playmind](playmind.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 15:28 | ✅ | | |
| 155 | −| [ADVENS](advens.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | | |
| 156 | −| [Catalyst Canada](catalystcanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 18:02 | ✅ | | |
| 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 | ✅ | | |
| 158 | −| [DONTNOD](dontnod.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 18:11 | ✅ | | |
| 159 | −| [FZ Engineering](fzengineering.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 17:24 | ✅ | | |
| 160 | −| [Loiselle inc.](loiselleinc.md) | 2 | 0 % | 100 % | 50 % | 2026-10-26 15:16 | ✅ | | |
| 161 | −| [MSX International](msxinternational.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 15:25 | ✅ | | |
| 162 | −| [McDonald's Restaurants](mcdonaldscanada.md) | 2 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 163 | −| [Santropol Roulant](santropolroulant.md) | 2 | 50 % | 100 % | 0 % | 2026-10-26 15:35 | ✅ | | |
| 164 | −| [The Climate Reality Project Canada](theclimaterealityprojectcanada.md) | 2 | 0 % | 100 % | 100 % | 2026-10-26 15:43 | ✅ | | |
| 165 | −| [Waterwell Irrigation](waterwellirrigation.md) | 2 | 50 % | 100 % | 0 % | 2026-10-26 15:49 | ✅ | | |
| 166 | −| [Lactanet](lactanet.md) | 2 | 0 % | 50 % | 0 % | 2026-10-26 15:14 | ✅ | | |
| 167 | −| [GoLogic](gologic.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:27 | ✅ | | |
| 168 | −| [Sparkgrid](sparkgrid.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 169 | −| [Stelpro](stelpro.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 170 | −| [Talsom](talsom.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:40 | ✅ | | |
| 171 | −| [Xplornet](xplornet.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:50 | ✅ | | |
| 172 | −| [Centre multiethnique de Québec](centremultiethniquedequbec.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 18:03 | ✅ | | |
| 173 | −| [École des entrepreneurs du Québec](coledesentrepreneursduqubec.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 18:08 | ✅ | | |
| 174 | −| [ADGA Group Consultants Inc](adgagroupconsultantsinc1.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | | |
| 175 | −| [AG Globe Services](agglobeservices.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:50 | ✅ | | |
| 176 | −| [AVEQ](aveq.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:54 | ✅ | | |
| 177 | −| [Ariolix](ariolix.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:52 | ✅ | | |
| 178 | −| [Averna](averna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:54 | ✅ | | |
| 179 | −| [C2 Montréal](c2montral.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:57 | ✅ | | |
| 180 | −| [CM Labs](cmlabs.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 18:08 | ✅ | | |
| 181 | −| [Club Assurance](clubassurance.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:08 | ✅ | | |
| 182 | −| [DLC Teams](dlcteams.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:10 | ✅ | | |
| 183 | −| [E*Pro Inc](eproinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:13 | ✅ | | |
| 184 | −| [Fenêtres Concept inc.](fentresconceptinc.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 18:17 | ✅ | | |
| 185 | −| [Infrastructel Inc.](infrastructelinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:41 | ✅ | | |
| 186 | −| [Ingeniu inc.](ingeniuinc.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 17:41 | ✅ | | |
| 187 | −| [Mobz](jobmobz1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:12 | ✅ | | |
| 188 | −| [LVMH Perfumes & Cosmetics](lvmhperfumescosmetics.md) | 1 | 100 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 189 | −| [Logient](logient.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:15 | ✅ | | |
| 190 | −| [Marquis Imprimeur Inc.](marquisimprimeurinc.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 15:16 | ✅ | | |
| 191 | −| [Nexxus Foods](nexxusfoods.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:26 | ✅ | | |
| 192 | −| [ON Animation Studio](onanimationstudio.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:27 | ✅ | | |
| 193 | −| [Recruitment Solutions Integrators](recruitmentsolutionsintegrators.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:32 | ✅ | | |
| 194 | −| [Segic](segic.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:36 | ✅ | | |
| 195 | −| [spruceinfotech](spruceinfotech2.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 196 | −| [Star Marketing](starmarketing.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:39 | ✅ | | |
| 197 | −| [Tyco](tyco.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:44 | ✅ | | |
| 198 | −| [WCG International Consultants Ltd.](wcginternationalconsultantsltd.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 15:49 | ✅ | | |
| 199 | −| [Westcliff](westcliff.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:49 | ✅ | | |
| 200 | −| [ADF Diesel](adfdiesel.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 17:49 | ✅ | | |
| 201 | −| [DIMENSION COMPOSITE INC](dimensioncompositeinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:10 | ✅ | | |
| 202 | −| [Dimonoff](dimonoff.md) | 1 | 100 % | 100 % | 100 % | 2026-10-26 18:10 | ✅ | | |
| 203 | −| [Ekosystem](ekosystem.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 18:13 | ✅ | | |
| 204 | −| [Maison l'Échelon](maisonlchelon.md) | 1 | 0 % | 100 % | 0 % | 2026-10-26 15:16 | ✅ | | |
| 205 | −| [Tonic DNA](tonicdna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-26 15:43 | ✅ | | |
| 206 | −| [Venture Media](venturemedia.md) | 0 | — | — | — | 2026-10-26 15:45 | ✅ | | |
| 207 | −| [California Closets](californiaclosets.md) | 0 | — | — | — | 2026-10-26 17:57 | ✅ | | |
| 208 | −| [Trupanion](trupanion1.md) | 0 | — | — | — | 2026-10-26 15:44 | ✅ | | |
| 209 | −| [Arago](arago.md) | 0 | — | — | — | 2026-10-26 17:52 | ✅ | | |
| 210 | −| [CCA](cca1.md) | 0 | — | — | — | 2026-10-26 18:02 | ✅ | | |
| 211 | −| [General Dynamics Missions System International](gdmsi.md) | 0 | — | — | — | 2026-10-26 17:25 | ✅ | | |
| 212 | −| [J.S. Held LLC](jsheldllc.md) | 0 | — | — | — | 2026-10-26 15:12 | ✅ | | |
| 213 | −| [NielsenIQ](nielseniq.md) | 0 | — | — | — | 2026-10-26 15:26 | ✅ | | |
| 214 | −| [Software Mind](softwaremind.md) | 0 | — | — | — | 2026-10-26 15:38 | ✅ | | |
| 215 | −| [Évolupharma Inc.](volupharmainc.md) | 0 | — | — | — | 2026-10-26 18:16 | ✅ | | |
| 44 | +| [CIMA+](cima2.md) | 260 | 1 % | 100 % | 90 % | 2026-10-27 12:26 | ✅ | | |
| 45 | +| [Reitmans](reitmanscanadalteltd.md) | 208 | 18 % | 100 % | 32 % | 2026-10-27 10:46 | ✅ | | |
| 46 | +| [American Iron and Metal](americanironandmetal.md) | 201 | 20 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ | | |
| 47 | +| [Sodexo Canada](sodexocanadaltd.md) | 143 | 83 % | 99 % | 6 % | 2026-10-27 10:52 | ✅ | | |
| 48 | +| [Ubisoft](ubisoft.md) | 137 | 0 % | 100 % | 1 % | 2026-10-27 10:59 | ✅ | | |
| 49 | +| [Artelia Canada](artelia.md) | 106 | 0 % | 100 % | 23 % | 2026-10-27 13:31 | ✅ | | |
| 50 | +| [Groupe Helios](groupehelios.md) | 105 | 2 % | 100 % | 2 % | 2026-10-27 12:45 | ✅ | | |
| 51 | +| [Vidéotron](videotron.md) | 102 | 7 % | 100 % | 42 % | 2026-10-27 11:01 | ✅ | | |
| 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-27 13:18 | ✅ | | |
| 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-27 12:36 | ✅ | | |
| 56 | +| [Dexterra](dexterra.md) | 61 | 0 % | 100 % | 11 % | 2026-10-27 12:32 | ✅ | | |
| 57 | +| [Groupe Canam](groupecanam.md) | 52 | 71 % | 98 % | 29 % | 2026-10-27 12:45 | ✅ | | |
| 58 | +| [Info-Ways](info_ways.md) | 39 | 0 % | 100 % | 8 % | 2026-10-27 13:07 | ✅ | | |
| 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-27 10:52 | ✅ | | |
| 61 | +| [system canada technologies](systemcanadatechnologies.md) | 38 | 0 % | 100 % | 0 % | 2026-10-27 10:55 | ✅ | | |
| 62 | +| [QSL](qsl.md) | 34 | 29 % | 100 % | 6 % | 2026-10-27 10:45 | ✅ | | |
| 63 | +| [KABS](kabs.md) | 34 | 0 % | 100 % | 3 % | 2026-10-27 13:15 | ✅ | | |
| 64 | +| [LGI Healthcare Solutions Santé Inc.](lgihealthcaresolutionssanteinc.md) | 29 | 0 % | 100 % | 76 % | 2026-10-27 13:18 | ✅ | | |
| 65 | +| [Rodeo FX](rodeofx.md) | 27 | 0 % | 93 % | 11 % | 2026-10-27 10:47 | ✅ | | |
| 66 | +| [Structube](structube1.md) | 27 | 0 % | 100 % | 0 % | 2026-10-27 10:54 | ✅ | | |
| 67 | +| [Wabtec](wabtec.md) | 25 | 16 % | 100 % | 36 % | 2026-10-27 11:02 | ✅ | | |
| 68 | +| [AbbVie](abbvie.md) | 24 | 0 % | 100 % | 92 % | 2026-10-27 13:27 | ✅ | | |
| 69 | +| [MEDFAR Solutions Cliniques](medfar.md) | 23 | 0 % | 100 % | 91 % | 2026-10-27 13:21 | ✅ | | |
| 70 | +| [Transat A.T.](transatat1.md) | 23 | 0 % | 100 % | 30 % | 2026-10-27 10:58 | ✅ | | |
| 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-27 10: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-27 12:33 | ✅ | | |
| 75 | +| [NBCUniversal](nbcuniversal3.md) | 20 | 0 % | 95 % | 85 % | 2026-10-27 13:24 | ✅ | | |
| 76 | +| [Sia](sia.md) | 20 | 0 % | 100 % | 30 % | 2026-10-27 10:50 | ✅ | | |
| 77 | +| [Vosker](vosker.md) | 19 | 0 % | 100 % | 89 % | 2026-10-27 11:01 | ✅ | | |
| 78 | +| [Scalian](scalian.md) | 19 | 16 % | 100 % | 100 % | 2026-10-27 10:49 | ✅ | | |
| 79 | +| [H&M](hmgroup.md) | 18 | 0 % | 100 % | 0 % | 2026-10-27 13:05 | ✅ | | |
| 80 | +| [REXEL](rexel1.md) | 18 | 0 % | 100 % | 0 % | 2026-10-27 10:47 | ✅ | | |
| 81 | +| [Sika Canada](sikaag.md) | 17 | 6 % | 100 % | 18 % | 2026-10-27 10:51 | ✅ | | |
| 82 | +| [Frima Studio](frimastudio.md) | 17 | 0 % | 100 % | 94 % | 2026-10-27 12:41 | ✅ | | |
| 83 | +| [Egis Group](egisgroup.md) | 16 | 0 % | 100 % | 25 % | 2026-10-27 12:36 | ✅ | | |
| 84 | +| [AECOM](aecom2.md) | 15 | 0 % | 100 % | 80 % | 2026-10-27 13:28 | ✅ | | |
| 85 | +| [Renovco](renovco.md) | 14 | 0 % | 100 % | 0 % | 2026-10-27 10:46 | ✅ | | |
| 86 | +| [Gameloft](gameloft.md) | 13 | 0 % | 100 % | 69 % | 2026-10-27 12:41 | ✅ | | |
| 87 | +| [Lemay](lemay.md) | 13 | 8 % | 100 % | 69 % | 2026-10-27 13:18 | ✅ | | |
| 88 | +| [Groupe Montoni](groupemontoni.md) | 13 | 0 % | 100 % | 15 % | 2026-10-27 12:45 | ✅ | | |
| 89 | +| [Talan](talan.md) | 12 | 0 % | 100 % | 83 % | 2026-10-27 10:55 | ✅ | | |
| 90 | +| [McWane Canada](mcwanecanada.md) | 12 | 58 % | 100 % | 0 % | 2026-10-27 13:21 | ✅ | | |
| 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-27 13:07 | ✅ | | |
| 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-27 13:19 | ✅ | | |
| 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-27 10:46 | ✅ | | |
| 97 | +| [Turner & Townsend](turnertownsend.md) | 10 | 40 % | 100 % | 60 % | 2026-10-27 10:59 | ✅ | | |
| 98 | +| [J'Excelle](jexcelleinc.md) | 9 | 0 % | 100 % | 11 % | 2026-10-27 13:09 | ✅ | | |
| 99 | +| [act digital](altersolutions.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ | | |
| 100 | +| [JYSK Canada](jyskcanada.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:15 | ✅ | | |
| 101 | +| [LGT](lgt1.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ | | |
| 102 | +| [Manitoulin Group of Companies](manitoulingroupofcompanies.md) | 9 | 56 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ | | |
| 103 | +| [Utask](utask.md) | 9 | 0 % | 100 % | 0 % | 2026-10-27 11:00 | ✅ | | |
| 104 | +| [CF Montréal](cfmontreal.md) | 8 | 0 % | 75 % | 0 % | 2026-10-27 12:24 | ✅ | | |
| 105 | +| [People Can Fly](peoplecanfly.md) | 8 | 0 % | 100 % | 100 % | 2026-10-27 10:41 | ✅ | | |
| 106 | +| [Canadian Helicopters](canadianhelicopters.md) | 8 | 0 % | 100 % | 0 % | 2026-10-27 13:37 | ✅ | | |
| 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-27 13:19 | ✅ | | |
| 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-27 13:19 | ✅ | | |
| 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-27 12:25 | ✅ | | |
| 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-27 10:58 | ✅ | | |
| 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-27 10:50 | ✅ | | |
| 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-27 13:18 | ✅ | | |
| 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-27 11:08 | ✅ | | |
| 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-27 12:31 | ✅ | | |
| 123 | +| [Groupe Beaudry](groupebeaudry.md) | 5 | 40 % | 100 % | 0 % | 2026-10-27 12:45 | ✅ | | |
| 124 | +| [MVV](mvv1.md) | 5 | 0 % | 100 % | 60 % | 2026-10-27 13:24 | ✅ | | |
| 125 | +| [HoYoverse](hoyoverse.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:05 | ✅ | | |
| 126 | +| [GURU Boisson Énergisante](guruorganicenergydrink.md) | 4 | 0 % | 100 % | 75 % | 2026-10-27 13:01 | ✅ | | |
| 127 | +| [Acumatica](acumatica.md) | 4 | 25 % | 100 % | 100 % | 2026-10-27 13:28 | ✅ | | |
| 128 | +| [Boreala Management](borealamanagement.md) | 4 | 0 % | 100 % | 50 % | 2026-10-27 13:35 | ✅ | | |
| 129 | +| [Chewi Creative](chewicreative.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 12:26 | ✅ | | |
| 130 | +| [Continental Group Sector ContiTech](continentalgroupsectorcontitech.md) | 4 | 25 % | 100 % | 25 % | 2026-10-27 12:31 | ✅ | | |
| 131 | +| [Ensiti](ensiti.md) | 4 | 0 % | 100 % | 75 % | 2026-10-27 12:36 | ✅ | | |
| 132 | +| [Luckyhammers](luckyhammers.md) | 4 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ | | |
| 133 | +| [META4](meta4.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:23 | ✅ | | |
| 134 | +| [Nmédia](nmdia.md) | 4 | 0 % | 100 % | 100 % | 2026-10-27 13:25 | ✅ | | |
| 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-27 10:41 | ✅ | | |
| 137 | +| [Outpost VFX](outpostvfx.md) | 4 | 0 % | 100 % | 25 % | 2026-10-27 10:41 | ✅ | | |
| 138 | +| [Prelib](prelib.md) | 4 | 75 % | 100 % | 50 % | 2026-10-27 10:42 | ✅ | | |
| 139 | +| [Pyrotek](pyrotek3.md) | 4 | 75 % | 100 % | 0 % | 2026-10-27 10:45 | ✅ | | |
| 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-27 13:28 | ✅ | | |
| 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-27 12:31 | ✅ | | |
| 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-27 12:41 | ✅ | | |
| 146 | +| [Intersand](intersand.md) | 3 | 0 % | 100 % | 33 % | 2026-10-27 13:08 | ✅ | | |
| 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-27 13:19 | ✅ | | |
| 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-27 13:24 | ✅ | | |
| 151 | +| [Oboxmedia](oboxmedia1.md) | 3 | 0 % | 100 % | 0 % | 2026-10-27 13:26 | ✅ | | |
| 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-27 13:18 | ✅ | | |
| 154 | +| [Playmind](playmind.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 10:41 | ✅ | | |
| 155 | +| [ADVENS](advens.md) | 2 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ | | |
| 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-27 12:30 | ✅ | | |
| 158 | +| [DONTNOD](dontnod.md) | 2 | 0 % | 100 % | 100 % | 2026-10-27 12:33 | ✅ | | |
| 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-27 13:18 | ✅ | | |
| 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-27 13:19 | ✅ | | |
| 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-27 10:58 | ✅ | | |
| 165 | +| [Waterwell Irrigation](waterwellirrigation.md) | 2 | 50 % | 100 % | 0 % | 2026-10-27 11:07 | ✅ | | |
| 166 | +| [GoLogic](gologic.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:43 | ✅ | | |
| 167 | +| [Sparkgrid](sparkgrid.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ | | |
| 168 | +| [Stelpro](stelpro.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ | | |
| 169 | +| [Talsom](talsom.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:55 | ✅ | | |
| 170 | +| [Xplornet](xplornet.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 11:08 | ✅ | | |
| 171 | +| [Centre multiethnique de Québec](centremultiethniquedequbec.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 12:24 | ✅ | | |
| 172 | +| [École des entrepreneurs du Québec](coledesentrepreneursduqubec.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 12:30 | ✅ | | |
| 173 | +| [ADGA Group Consultants Inc](adgagroupconsultantsinc1.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ | | |
| 174 | +| [AG Globe Services](agglobeservices.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ | | |
| 175 | +| [AVEQ](aveq.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:32 | ✅ | | |
| 176 | +| [Ariolix](ariolix.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:30 | ✅ | | |
| 177 | +| [Averna](averna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:32 | ✅ | | |
| 178 | +| [C2 Montréal](c2montral.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:36 | ✅ | | |
| 179 | +| [CM Labs](cmlabs.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 12:30 | ✅ | | |
| 180 | +| [Club Assurance](clubassurance.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:30 | ✅ | | |
| 181 | +| [DLC Teams](dlcteams.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:33 | ✅ | | |
| 182 | +| [E*Pro Inc](eproinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:36 | ✅ | | |
| 183 | +| [Fenêtres Concept inc.](fentresconceptinc.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 12:40 | ✅ | | |
| 184 | +| [Infrastructel Inc.](infrastructelinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:07 | ✅ | | |
| 185 | +| [Mobz](jobmobz1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 13:15 | ✅ | | |
| 186 | +| [LVMH Perfumes & Cosmetics](lvmhperfumescosmetics.md) | 1 | 100 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ | | |
| 187 | +| [Logient](logient.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:18 | ✅ | | |
| 188 | +| [Marquis Imprimeur Inc.](marquisimprimeurinc.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 13:19 | ✅ | | |
| 189 | +| [Nexxus Foods](nexxusfoods.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:25 | ✅ | | |
| 190 | +| [ON Animation Studio](onanimationstudio.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:40 | ✅ | | |
| 191 | +| [Recruitment Solutions Integrators](recruitmentsolutionsintegrators.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:46 | ✅ | | |
| 192 | +| [Segic](segic.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 10:49 | ✅ | | |
| 193 | +| [spruceinfotech](spruceinfotech2.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ | | |
| 194 | +| [Star Marketing](starmarketing.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:53 | ✅ | | |
| 195 | +| [Tyco](tyco.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 10:59 | ✅ | | |
| 196 | +| [WCG International Consultants Ltd.](wcginternationalconsultantsltd.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 11:07 | ✅ | | |
| 197 | +| [Westcliff](westcliff.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 11:08 | ✅ | | |
| 198 | +| [ADF Diesel](adfdiesel.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:28 | ✅ | | |
| 199 | +| [DIMENSION COMPOSITE INC](dimensioncompositeinc.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:33 | ✅ | | |
| 200 | +| [Dimonoff](dimonoff.md) | 1 | 100 % | 100 % | 100 % | 2026-10-27 12:33 | ✅ | | |
| 201 | +| [Ekosystem](ekosystem.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 12:36 | ✅ | | |
| 202 | +| [Lactanet](lactanet.md) | 1 | 0 % | 0 % | 0 % | 2026-10-27 13:17 | ✅ | | |
| 203 | +| [Maison l'Échelon](maisonlchelon.md) | 1 | 0 % | 100 % | 0 % | 2026-10-27 13:19 | ✅ | | |
| 204 | +| [Tonic DNA](tonicdna1.md) | 1 | 0 % | 100 % | 100 % | 2026-10-27 10:58 | ✅ | | |
| 205 | +| [Venture Media](venturemedia.md) | 0 | — | — | — | 2026-10-27 11:01 | ✅ | | |
| 206 | +| [California Closets](californiaclosets.md) | 0 | — | — | — | 2026-10-27 13:36 | ✅ | | |
| 207 | +| [Trupanion](trupanion1.md) | 0 | — | — | — | 2026-10-27 10:59 | ✅ | | |
| 208 | +| [Arago](arago.md) | 0 | — | — | — | 2026-10-27 13:30 | ✅ | | |
| 209 | +| [CCA](cca1.md) | 0 | — | — | — | 2026-10-27 13:41 | ✅ | | |
| 210 | +| [General Dynamics Missions System International](gdmsi.md) | 0 | — | — | — | 2026-10-27 12:41 | ✅ | | |
| 211 | +| [J.S. Held LLC](jsheldllc.md) | 0 | — | — | — | 2026-10-27 13:15 | ✅ | | |
| 212 | +| [NielsenIQ](nielseniq.md) | 0 | — | — | — | 2026-10-27 13:25 | ✅ | | |
| 213 | +| [Software Mind](softwaremind.md) | 0 | — | — | — | 2026-10-27 10:52 | ✅ | | |
| 214 | +| [Évolupharma Inc.](volupharmainc.md) | 0 | — | — | — | 2026-10-27 11:01 | ✅ | | |
| 216 | 215 | |
| 217 | 216 | ## Licence / conformité |
| 218 | 217 | |
modified
docs/connecteurs/ingeniuinc.md
+23 −22
@@ -4,39 +4,40 @@ Job·Ka — Groupe KA | ||
| 4 | 4 | Auteur : Simon-Pierre Boucher |
| 5 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/ingeniuinc.md |
| 7 | −Rôle : Fiche connecteur — Ingeniu inc. (employeur direct, ATS smartrecruiters) | |
| 8 | −Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 7 | +Rôle : Fiche connecteur — Ingeniu inc. (employeur direct, ATS odoo) | |
| 8 | +Généré : 2026-10-27 13:42 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 9 | 9 | relancer le script pour régénérer. |
| 10 | 10 | ============================================================================= |
| 11 | 11 | --> |
| 12 | 12 | |
| 13 | 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 | 17 | ## Description |
| 18 | 18 | |
| 19 | −- **Site** : [Ingeniu inc.]() | |
| 20 | −- **Page carrières** : https://jobs.smartrecruiters.com/company/IngeniuInc | |
| 19 | +- **Site** : [Ingeniu inc.](https://www.ingeniusolutions.com) | |
| 20 | +- **Page carrières** : https://www.ingeniusolutions.com/jobs | |
| 21 | 21 | - **Secteurs** : Ingénierie, Conseil |
| 22 | 22 | - **Région** : Montréal |
| 23 | 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 | 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 | 28 | - **Identifiants du tenant** (attributs du connecteur) : |
| 29 | 29 | |
| 30 | 30 | | Attribut | Valeur | |
| 31 | 31 | |---|---| |
| 32 | −| `COMPANY` | `IngeniuInc` | | |
| 33 | 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 | 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 | 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 | 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 | 53 | | `employment_type` — Type | temps_plein / temps_partiel / … | 100 % | |
| 53 | 54 | | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % | |
| 54 | 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 | 57 | | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % | |
| 57 | 58 | | `date_posted` — Date de parution | ISO 8601 | 100 % | |
| 58 | 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 | 61 | | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % | |
| 61 | 62 | | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % | |
| 62 | 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 | 68 | ## Fréquence & budgets |
| 68 | 69 | |
| 69 | 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 | 72 | - **Budgets / plafonds (variables d'environnement)** : |
| 72 | 73 | |
| 73 | 74 | | Variable | Défaut | |
| 74 | 75 | |---|---| |
| 75 | −| `JOBKA_SR_DETAIL_LIMIT` | `300` | | |
| 76 | +| `JOBKA_ODOO_DETAIL_LIMIT` | `60` | | |
| 76 | 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 | 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 | −- **Salaire** : 0/1 actives (0 %) | |
| 84 | −- **GPS** : 1/1 actives (100 %) | |
| 85 | −- **Mode** : 1/1 actives (100 %) | |
| 86 | −- **Parution** : 1/1 actives (100 %) | |
| 87 | −- **Dernier sync** : 2026-10-14 15:23 — trouvées 1, +0, ~0, -0 | |
| 88 | −- **Syncs enregistrés** (`sync_log`) : 486 | |
| 83 | +- **Offres en base** : 3 (dont **2 actives**, 0 masquées comme doublons `dup_of`) | |
| 84 | +- **Salaire** : 0/2 actives (0 %) | |
| 85 | +- **GPS** : 0/2 actives (0 %) | |
| 86 | +- **Mode** : 2/2 actives (100 %) | |
| 87 | +- **Parution** : 2/2 actives (100 %) | |
| 88 | +- **Dernier sync** : 2026-10-27 13:42 — trouvées 2, +2, ~0, -0 | |
| 89 | +- **Syncs enregistrés** (`sync_log`) : 603 | |
| 89 | 90 | |
| 90 | 91 | ## Erreurs & dépannage |
| 91 | 92 | |
modified
jobka/connectors/ingeniuinc.py
+14 −6
@@ -3,14 +3,22 @@ | ||
| 3 | 3 | # Auteur : Simon-Pierre Boucher |
| 4 | 4 | # Contact : contact@spboucher.ai |
| 5 | 5 | # Fichier : jobka/connectors/ingeniuinc.py |
| 6 | −# Rôle : Connecteur Ingeniu inc. — smartrecruiters (org « IngeniuInc ») | |
| 7 | −# [généré par scripts/gen_connectors.py, flux vérifié le 2026-08-23] | |
| 8 | −# Créé : 2026-08-23 Modifié : 2026-08-23 | |
| 6 | +# Rôle : Connecteur Ingeniu inc. — Odoo website_hr_recruitment sur | |
| 7 | +# www.ingeniusolutions.com (ex-SmartRecruiters « IngeniuInc ») | |
| 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 | 22 | source_id = 'ingeniuinc' |
| 15 | 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 | ||