SPB Git

spb/job-ka

Public

[ka6] fix connecteur canadian_royalties: frontal ADP intermittent PAR CID (9e cas, garde-fou retry borné + repli détail répliqués) — stale causé par les 404 des 31/10 23:03 et 01/11 01:26 après une journée d'intermittence (404 isolés à 10:48 et 18:19 entre des syncs verts found=5, épisode nocturne multi-tenants 23:45→04:42 en amont) ; sonde live 1/6 essais 200 totalNumber=5 + 5 « default backend - 404 » de 21 octets = intermittence, tenant vivant ; garde-fou _get_json (30 essais, pause 2 s, timeout 15 s) ET repli « détail seulement » répliqués de bento_sushi/cookit/mitsubishi_hc_capital/niobec/osgoode_properties/uv_assurance/strathmore/nemaska_lithium (le connecteur était resté minimal, sans aucune des deux défenses) ; sync isolé vert found=5 (= médiane 5.0) en 0,4 s, 108 tests pytest verts, fiches canadian_royalties.md/ats-adp.md/INDEX.md régénérées, pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 1, 2026) parent 3b8c175 Browse files

4 changed files +241 −73

modified docs/connecteurs/INDEX.md +36 −36
@@ -5,16 +5,16 @@ Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/INDEX.md 6 Fichier : docs/connecteurs/INDEX.md
7 Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt) 7 Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt)
8−Généré : 2026-10-31 13:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-11-01 01:53 EST par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
12 12
13 # Job·Ka — Connecteurs (index) 13 # Job·Ka — Connecteurs (index)
14 14
15−> Index généré le 2026-10-31 13:33 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-11-01 01:53 EST 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−**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25366 offres actives** (22732 directes, 2634 portails ; 111 masquées comme doublons inter-sources, soit 25255 visibles). 1135 fiches. 17+**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **24589 offres actives** (22710 directes, 1879 portails ; 85 masquées comme doublons inter-sources, soit 24504 visibles). 1135 fiches.
18 18
19 Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes). 19 Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes).
20 20
@@ -22,21 +22,21 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
22 22
23 | Plateforme | Employeurs | Actives | Salaire | GPS | 23 | Plateforme | Employeurs | Actives | Salaire | GPS |
24 |---|---|---|---|---| 24 |---|---|---|---|---|
25−| [`workday`](ats-workday.md) | 232 | 7347 | 47 % | 88 % | 25+| [`workday`](ats-workday.md) | 232 | 7337 | 47 % | 88 % |
26−| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2894 | 16 % | 99 % | 26+| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2893 | 16 % | 99 % |
27 | [`workable`](ats-workable.md) | 71 | 1993 | 17 % | 100 % | 27 | [`workable`](ats-workable.md) | 71 | 1993 | 17 % | 100 % |
28−| [`dayforce`](ats-dayforce.md) | 129 | 1899 | 10 % | 100 % | 28+| [`dayforce`](ats-dayforce.md) | 129 | 1897 | 10 % | 100 % |
29−| [`successfactors`](ats-successfactors.md) | 12 | 1639 | 19 % | 99 % | 29+| [`successfactors`](ats-successfactors.md) | 12 | 1637 | 19 % | 99 % |
30−| [`njoyn`](ats-njoyn.md) | 11 | 1265 | 69 % | 87 % | 30+| [`njoyn`](ats-njoyn.md) | 11 | 1266 | 69 % | 87 % |
31−| [`workland`](ats-workland.md) | 1 | 1106 | 37 % | 100 % | 31+| [`workland`](ats-workland.md) | 1 | 1140 | 36 % | 100 % |
32−| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 805 | 6 % | 100 % | 32+| [`greenhouse`](ats-greenhouse.md) | 132 | 791 | 19 % | 100 % |
33−| [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % | 33+| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 765 | 6 % | 100 % |
34 | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % | 34 | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % |
35 | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % | 35 | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % |
36 | [`ashby`](ats-ashby.md) | 41 | 308 | 54 % | 57 % | 36 | [`ashby`](ats-ashby.md) | 41 | 308 | 54 % | 57 % |
37 | [`recruitee`](ats-recruitee.md) | 30 | 280 | 21 % | 97 % | 37 | [`recruitee`](ats-recruitee.md) | 30 | 280 | 21 % | 97 % |
38 | [`bamboohr`](ats-bamboohr.md) | 37 | 275 | 8 % | 100 % | 38 | [`bamboohr`](ats-bamboohr.md) | 37 | 275 | 8 % | 100 % |
39−| [`taleo_tbe`](ats-taleo_tbe.md) | 7 | 214 | 28 % | 57 % | 39+| [`taleo_tbe`](ats-taleo_tbe.md) | 7 | 213 | 27 % | 58 % |
40 | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % | 40 | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % |
41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 144 | 14 % | 86 % | 41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 144 | 14 % | 86 % |
42 | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % | 42 | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % |
@@ -54,24 +54,24 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
54 54
55 | Source | Actives | Salaire | Dernier sync | 55 | Source | Actives | Salaire | Dernier sync |
56 |---|---|---|---| 56 |---|---|---|---|
57−| [Espresso-Jobs](espresso_jobs.md) | 157 | 22 % | 2026-10-31 11:59 | 57+| [Espresso-Jobs](espresso_jobs.md) | 156 | 22 % | 2026-11-01 01:45 |
58−| [Guichet-Emplois (Canada)](guichet_emplois.md) | 501 | 100 % | 2026-10-31 12:08 | 58+| [Guichet-Emplois (Canada)](guichet_emplois.md) | 502 | 100 % | 2026-11-01 01:52 |
59−| [Jobillico](jobillico.md) | 1976 | 34 % | 2026-10-31 12:21 | 59+| [Jobillico](jobillico.md) | 1221 | 30 % | 2026-11-01 01:04 |
60 | [Dépôt direct employeurs](depot-direct.md) | 0 (0 en modération) | — | au fil de l'eau | 60 | [Dépôt direct employeurs](depot-direct.md) | 0 (0 en modération) | — | au fil de l'eau |
61 61
62 ## Employeurs directs (par volume d'offres actives) 62 ## Employeurs directs (par volume d'offres actives)
63 63
64 | Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK | 64 | Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK |
65 |---|---|---|---|---|---| 65 |---|---|---|---|---|---|
66−| [Réseau Atlas Workland (~80 employeurs QC : CSS, cégeps, Santé Québec, STQ, UQTR…)](atlas_workland.md) | [`workland`](ats-workland.md) | 1106 | 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) | 1140 | 36 % | 100 % | ✅ |
67 | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 984 | 70 % | 67 % | ✅ | 67 | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 984 | 70 % | 67 % | ✅ |
68 | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 959 | 23 % | 100 % | ✅ | 68 | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 959 | 23 % | 100 % | ✅ |
69 | [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 899 | 1 % | 100 % | ✅ | 69 | [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 899 | 1 % | 100 % | ✅ |
70−| [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 886 | 98 % | 91 % | ✅ | 70+| [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 880 | 98 % | 91 % | ✅ |
71 | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 817 | 98 % | 98 % | ✅ | 71 | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 817 | 98 % | 98 % | ✅ |
72 | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ | 72 | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ |
73−| [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 395 | 82 % | 100 % | ✅ | 73+| [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 396 | 82 % | 100 % | ✅ |
74−| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 298 | 0 % | 94 % | ✅ | 74+| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 299 | 0 % | 94 % | ✅ |
75 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ | 75 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ |
76 | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 276 | 1 % | 92 % | ✅ | 76 | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 276 | 1 % | 92 % | ✅ |
77 | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 267 | 17 % | 98 % | ✅ | 77 | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 267 | 17 % | 98 % | ✅ |
@@ -82,28 +82,28 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
82 | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 208 | 4 % | 100 % | ✅ | 82 | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 208 | 4 % | 100 % | ✅ |
83 | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 207 | 0 % | 82 % | ✅ | 83 | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 207 | 0 % | 82 % | ✅ |
84 | [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 204 | 20 % | 100 % | ✅ | 84 | [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 204 | 20 % | 100 % | ✅ |
85−| [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 184 | 94 % | 96 % | ✅ | 85+| [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 182 | 94 % | 96 % | ✅ |
86−| [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 175 | 2 % | 100 % | ✅ | 86+| [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 168 | 2 % | 100 % | ✅ |
87−| [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 153 | 5 % | 100 % | ✅ | 87+| [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 152 | 5 % | 100 % | ✅ |
88 | [Le Groupe Maurice](groupemaurice.md) | [`dayforce`](ats-dayforce.md) | 148 | 0 % | 100 % | ✅ | 88 | [Le Groupe Maurice](groupemaurice.md) | [`dayforce`](ats-dayforce.md) | 148 | 0 % | 100 % | ✅ |
89 | [CISSS de l'Abitibi-Témiscamingue](cisss_abitibi.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 144 | 0 % | 100 % | ✅ | 89 | [CISSS de l'Abitibi-Témiscamingue](cisss_abitibi.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 144 | 0 % | 100 % | ✅ |
90 | [Sodexo Canada](sodexocanadaltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 143 | 82 % | 99 % | ✅ | 90 | [Sodexo Canada](sodexocanadaltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 143 | 82 % | 99 % | ✅ |
91−| [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 135 | 6 % | 100 % | ✅ |
92 | [Consignaction (AQRCB)](consignaction.md) | [`workday`](ats-workday.md) | 132 | 86 % | 100 % | ✅ | 91 | [Consignaction (AQRCB)](consignaction.md) | [`workday`](ats-workday.md) | 132 | 86 % | 100 % | ✅ |
93 | [Vetstrategy](vetstrategy.md) | [`dayforce`](ats-dayforce.md) | 132 | 2 % | 100 % | ✅ | 92 | [Vetstrategy](vetstrategy.md) | [`dayforce`](ats-dayforce.md) | 132 | 2 % | 100 % | ✅ |
94 | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 131 | 98 % | 100 % | ✅ | 93 | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 131 | 98 % | 100 % | ✅ |
95 | [Ubisoft](ubisoft.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 122 | 0 % | 100 % | ✅ | 94 | [Ubisoft](ubisoft.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 122 | 0 % | 100 % | ✅ |
96 | [Cascades](cascades.md) | [`successfactors`](ats-successfactors.md) | 112 | 83 % | 100 % | ✅ | 95 | [Cascades](cascades.md) | [`successfactors`](ats-successfactors.md) | 112 | 83 % | 100 % | ✅ |
97−| [TJX Canada (Winners, HomeSense, Marshalls)](tjx.md) | [`workday`](ats-workday.md) | 108 | 97 % | 100 % | ✅ |
98 | [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 108 | 6 % | 100 % | ✅ | 96 | [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 108 | 6 % | 100 % | ✅ |
97+| [TJX Canada (Winners, HomeSense, Marshalls)](tjx.md) | [`workday`](ats-workday.md) | 105 | 97 % | 100 % | ✅ |
99 | [CISSS de Chaudière-Appalaches](cisss_chaudiere_appalaches.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 103 | 2 % | 100 % | ✅ | 98 | [CISSS de Chaudière-Appalaches](cisss_chaudiere_appalaches.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 103 | 2 % | 100 % | ✅ |
99+| [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 103 | 8 % | 100 % | ✅ |
100 | [Groupe Helios](groupehelios.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 103 | 3 % | 100 % | ✅ | 100 | [Groupe Helios](groupehelios.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 103 | 3 % | 100 % | ✅ |
101 | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 102 | 16 % | 100 % | ✅ | 101 | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 102 | 16 % | 100 % | ✅ |
102 | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 98 | 10 % | 100 % | ✅ | 102 | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 98 | 10 % | 100 % | ✅ |
103 | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 97 | 0 % | 100 % | ✅ | 103 | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 97 | 0 % | 100 % | ✅ |
104 | [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 97 | 1 % | 78 % | ✅ | 104 | [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 97 | 1 % | 78 % | ✅ |
105−| [Sépaq](sepaq.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 97 | 54 % | 8 % | ✅ |
106 | [BMO Groupe financier](bmo.md) | [`workday`](ats-workday.md) | 96 | 80 % | 74 % | ✅ | 105 | [BMO Groupe financier](bmo.md) | [`workday`](ats-workday.md) | 96 | 80 % | 74 % | ✅ |
106+| [Sépaq](sepaq.md) | [`taleo_tbe`](ats-taleo_tbe.md) | 96 | 53 % | 8 % | ✅ |
107 | [HIKINEX](recruiting.md) | [`breezy`](ats-breezy.md) | 91 | 0 % | 100 % | ✅ | 107 | [HIKINEX](recruiting.md) | [`breezy`](ats-breezy.md) | 91 | 0 % | 100 % | ✅ |
108 | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 90 | 0 % | 100 % | ✅ | 108 | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 90 | 0 % | 100 % | ✅ |
109 | [Linen Chest](linenchest.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 89 | 8 % | 100 % | ✅ | 109 | [Linen Chest](linenchest.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 89 | 8 % | 100 % | ✅ |
@@ -119,9 +119,9 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
119 | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 72 | 0 % | 97 % | ✅ | 119 | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 72 | 0 % | 97 % | ✅ |
120 | [Banque CIBC](cibc.md) | [`workday`](ats-workday.md) | 71 | 0 % | 100 % | ✅ | 120 | [Banque CIBC](cibc.md) | [`workday`](ats-workday.md) | 71 | 0 % | 100 % | ✅ |
121 | [Dexterra](dexterra.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 67 | 0 % | 100 % | ✅ | 121 | [Dexterra](dexterra.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 67 | 0 % | 100 % | ✅ |
122+| [BPA (Experts-conseils)](bpa.md) | [`dayforce`](ats-dayforce.md) | 66 | 0 % | 100 % | ✅ |
122 | [Gray Collection (Groupe Antonopoulos)](graycollection.md) | [`dayforce`](ats-dayforce.md) | 66 | 0 % | 100 % | ✅ | 123 | [Gray Collection (Groupe Antonopoulos)](graycollection.md) | [`dayforce`](ats-dayforce.md) | 66 | 0 % | 100 % | ✅ |
123 | [EMCO](emcocorporation.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 65 | 40 % | 100 % | ✅ | 124 | [EMCO](emcocorporation.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 65 | 40 % | 100 % | ✅ |
124−| [BPA (Experts-conseils)](bpa.md) | [`dayforce`](ats-dayforce.md) | 64 | 0 % | 100 % | ✅ |
125 | [Lifeworks](lifeworks.md) | [`workday`](ats-workday.md) | 61 | 28 % | 87 % | ✅ | 125 | [Lifeworks](lifeworks.md) | [`workday`](ats-workday.md) | 61 | 28 % | 87 % | ✅ |
126 | [Kiewit (Ganotec)](kiewit_ganotec.md) | [`successfactors`](ats-successfactors.md) | 60 | 0 % | 100 % | ✅ | 126 | [Kiewit (Ganotec)](kiewit_ganotec.md) | [`successfactors`](ats-successfactors.md) | 60 | 0 % | 100 % | ✅ |
127 | [McKesson Canada](mckesson.md) | [`workday`](ats-workday.md) | 60 | 82 % | 87 % | ✅ | 127 | [McKesson Canada](mckesson.md) | [`workday`](ats-workday.md) | 60 | 82 % | 87 % | ✅ |
@@ -218,12 +218,10 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
218 | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ | 218 | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ |
219 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ | 219 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ |
220 | [Institut de recherche du CUSM](cusm_ir.md) | [`njoyn`](ats-njoyn.md) | 25 | 96 % | 0 % | ✅ | 220 | [Institut de recherche du CUSM](cusm_ir.md) | [`njoyn`](ats-njoyn.md) | 25 | 96 % | 0 % | ✅ |
221−| [Sun Life](sunlife.md) | [`workday`](ats-workday.md) | 25 | 28 % | 84 % | ✅ |
222 | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ | 221 | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ |
223 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ | 222 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ |
224 | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ | 223 | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ |
225 | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ | 224 | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ |
226−| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 24 | 4 % | 100 % | ✅ |
227 | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 24 | 83 % | 100 % | ✅ | 225 | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 24 | 83 % | 100 % | ✅ |
228 | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ | 226 | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ |
229 | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ | 227 | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ |
@@ -234,8 +232,10 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
234 | [OSEDEA](osedea.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ | 232 | [OSEDEA](osedea.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ |
235 | [Sanimax](sanimax.md) | [`workday`](ats-workday.md) | 24 | 25 % | 100 % | ✅ | 233 | [Sanimax](sanimax.md) | [`workday`](ats-workday.md) | 24 | 25 % | 100 % | ✅ |
236 | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 24 | 0 % | 100 % | ✅ | 234 | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 24 | 0 % | 100 % | ✅ |
235+| [Sun Life](sunlife.md) | [`workday`](ats-workday.md) | 24 | 29 % | 83 % | ✅ |
237 | [Airliquidehr](airliquidehr.md) | [`workday`](ats-workday.md) | 23 | 22 % | 100 % | ✅ | 236 | [Airliquidehr](airliquidehr.md) | [`workday`](ats-workday.md) | 23 | 22 % | 100 % | ✅ |
238 | [Broccolini](broccolini.md) | [`bamboohr`](ats-bamboohr.md) | 23 | 4 % | 100 % | ✅ | 237 | [Broccolini](broccolini.md) | [`bamboohr`](ats-bamboohr.md) | 23 | 4 % | 100 % | ✅ |
238+| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 23 | 4 % | 100 % | ✅ |
239 | [Cineplex](cineplex.md) | [`workday`](ats-workday.md) | 23 | 0 % | 96 % | ✅ | 239 | [Cineplex](cineplex.md) | [`workday`](ats-workday.md) | 23 | 0 % | 96 % | ✅ |
240 | [MEDFAR Solutions Cliniques](medfar.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ | 240 | [MEDFAR Solutions Cliniques](medfar.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ |
241 | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 23 | 9 % | 96 % | ✅ | 241 | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 23 | 9 % | 96 % | ✅ |
@@ -283,14 +283,13 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
283 | [Xsolla](xsolla.md) | [`lever`](ats-lever.md) | 19 | 100 % | 95 % | ✅ | 283 | [Xsolla](xsolla.md) | [`lever`](ats-lever.md) | 19 | 100 % | 95 % | ✅ |
284 | [ALS Global](alsglobal.md) | [`workday`](ats-workday.md) | 18 | 6 % | 94 % | ✅ | 284 | [ALS Global](alsglobal.md) | [`workday`](ats-workday.md) | 18 | 6 % | 94 % | ✅ |
285 | [Bell Textron Canada](bell_textron.md) | [`taleo`](ats-taleo.md) | 18 | 0 % | 100 % | ✅ | 285 | [Bell Textron Canada](bell_textron.md) | [`taleo`](ats-taleo.md) | 18 | 0 % | 100 % | ✅ |
286−| [Canada Vie](canada_vie.md) | [`successfactors`](ats-successfactors.md) | 18 | 94 % | 94 % | ✅ | 286+| [Canada Vie](canada_vie.md) | [`successfactors`](ats-successfactors.md) | 18 | 100 % | 94 % | ✅ |
287 | [CONTRÔLEUR](novatech.md) | [`dayforce`](ats-dayforce.md) | 18 | 39 % | 100 % | ✅ | 287 | [CONTRÔLEUR](novatech.md) | [`dayforce`](ats-dayforce.md) | 18 | 39 % | 100 % | ✅ |
288 | [KDC/ONE](kdcone.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ | 288 | [KDC/ONE](kdcone.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ |
289 | [Onelineage](onelineage.md) | [`workday`](ats-workday.md) | 18 | 6 % | 100 % | ✅ | 289 | [Onelineage](onelineage.md) | [`workday`](ats-workday.md) | 18 | 6 % | 100 % | ✅ |
290 | [Pré-assemblage](motionc.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ | 290 | [Pré-assemblage](motionc.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ |
291 | [REXEL](rexel1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 0 % | 100 % | ✅ | 291 | [REXEL](rexel1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 0 % | 100 % | ✅ |
292 | [Search for](bcf.md) | [`workday`](ats-workday.md) | 18 | 0 % | 100 % | ✅ | 292 | [Search for](bcf.md) | [`workday`](ats-workday.md) | 18 | 0 % | 100 % | ✅ |
293−| [VIA Rail Canada](via_rail.md) | [`successfactors`](ats-successfactors.md) | 18 | 11 % | 100 % | ✅ |
294 | [Vooban](vooban.md) | [`greenhouse`](ats-greenhouse.md) | 18 | 0 % | 100 % | ✅ | 293 | [Vooban](vooban.md) | [`greenhouse`](ats-greenhouse.md) | 18 | 0 % | 100 % | ✅ |
295 | [Wabtec](wabtec.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 22 % | 100 % | ✅ | 294 | [Wabtec](wabtec.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 22 % | 100 % | ✅ |
296 | [Énergir](energir.md) | [`successfactors`](ats-successfactors.md) | 18 | 56 % | 100 % | ✅ | 295 | [Énergir](energir.md) | [`successfactors`](ats-successfactors.md) | 18 | 56 % | 100 % | ✅ |
@@ -313,13 +312,14 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
313 | [Défis RH](defisrh.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 44 % | 94 % | ✅ | 312 | [Défis RH](defisrh.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 44 % | 94 % | ✅ |
314 | [Egis Group](egisgroup.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 16 | 0 % | 100 % | ✅ | 313 | [Egis Group](egisgroup.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 16 | 0 % | 100 % | ✅ |
315 | [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | [`adp`](ats-adp.md) | 16 | 25 % | 100 % | ✅ | 314 | [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | [`adp`](ats-adp.md) | 16 | 25 % | 100 % | ✅ |
315+| [Jci](jci.md) | [`workday`](ats-workday.md) | 16 | 100 % | 100 % | ✅ |
316 | [McGill St Laurent](mcgillstlaurentb8.md) | [`lever`](ats-lever.md) | 16 | 0 % | 100 % | ✅ | 316 | [McGill St Laurent](mcgillstlaurentb8.md) | [`lever`](ats-lever.md) | 16 | 0 % | 100 % | ✅ |
317 | [Réseau de transport de la Capitale](rtc_quebec.md) | [`njoyn`](ats-njoyn.md) | 16 | 0 % | 0 % | ✅ | 317 | [Réseau de transport de la Capitale](rtc_quebec.md) | [`njoyn`](ats-njoyn.md) | 16 | 0 % | 0 % | ✅ |
318 | [Réseau de transport de Longueuil (RTL)](rtl.md) | [`njoyn`](ats-njoyn.md) | 16 | 25 % | 0 % | ✅ | 318 | [Réseau de transport de Longueuil (RTL)](rtl.md) | [`njoyn`](ats-njoyn.md) | 16 | 25 % | 0 % | ✅ |
319+| [VIA Rail Canada](via_rail.md) | [`successfactors`](ats-successfactors.md) | 16 | 12 % | 100 % | ✅ |
319 | [Avocat·e, Bureau de l'avocate générale](mthris.md) | [`dayforce`](ats-dayforce.md) | 15 | 33 % | 100 % | ✅ | 320 | [Avocat·e, Bureau de l'avocate générale](mthris.md) | [`dayforce`](ats-dayforce.md) | 15 | 33 % | 100 % | ✅ |
320 | [Boralex](boralex.md) | [`dayforce`](ats-dayforce.md) | 15 | 0 % | 100 % | ✅ | 321 | [Boralex](boralex.md) | [`dayforce`](ats-dayforce.md) | 15 | 0 % | 100 % | ✅ |
321 | [GSK](gsk.md) | [`workday`](ats-workday.md) | 15 | 13 % | 100 % | ✅ | 322 | [GSK](gsk.md) | [`workday`](ats-workday.md) | 15 | 13 % | 100 % | ✅ |
322−| [Jci](jci.md) | [`workday`](ats-workday.md) | 15 | 100 % | 100 % | ✅ |
323 | [La Senza](lasenza.md) | [`greenhouse`](ats-greenhouse.md) | 15 | 13 % | 100 % | ✅ | 323 | [La Senza](lasenza.md) | [`greenhouse`](ats-greenhouse.md) | 15 | 13 % | 100 % | ✅ |
324 | [Mila — Institut québécois d'IA](mila_2.md) | [`workable`](ats-workable.md) | 15 | 0 % | 100 % | ✅ | 324 | [Mila — Institut québécois d'IA](mila_2.md) | [`workable`](ats-workable.md) | 15 | 0 % | 100 % | ✅ |
325 | [Peoplecorporation](peoplecorporation.md) | [`workday`](ats-workday.md) | 15 | 13 % | 80 % | ✅ | 325 | [Peoplecorporation](peoplecorporation.md) | [`workday`](ats-workday.md) | 15 | 13 % | 80 % | ✅ |
@@ -538,12 +538,10 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
538 | [Mistral AI](mistral_ai.md) | [`ashby`](ats-ashby.md) | 7 | 0 % | 71 % | ✅ | 538 | [Mistral AI](mistral_ai.md) | [`ashby`](ats-ashby.md) | 7 | 0 % | 71 % | ✅ |
539 | [Novisto](novisto78.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 0 % | 100 % | ✅ | 539 | [Novisto](novisto78.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 0 % | 100 % | ✅ |
540 | [Nutreco](nutreco.md) | [`workday`](ats-workday.md) | 7 | 14 % | 100 % | ✅ | 540 | [Nutreco](nutreco.md) | [`workday`](ats-workday.md) | 7 | 14 % | 100 % | ✅ |
541−| [Porta](porta.md) | [`dayforce`](ats-dayforce.md) | 7 | 29 % | 100 % | ✅ |
542 | [Scotts Canada (Fafard)](scottsmiraclegro.md) | [`workday`](ats-workday.md) | 7 | 0 % | 100 % | ✅ | 541 | [Scotts Canada (Fafard)](scottsmiraclegro.md) | [`workday`](ats-workday.md) | 7 | 0 % | 100 % | ✅ |
543 | [Surmesur](surmesur.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 86 % | 100 % | ✅ | 542 | [Surmesur](surmesur.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 86 % | 100 % | ✅ |
544 | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ | 543 | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ |
545 | [Trigyn Technologies](trigyntechnologies1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 0 % | 100 % | ✅ | 544 | [Trigyn Technologies](trigyntechnologies1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 0 % | 100 % | ✅ |
546−| [Turner & Townsend](turnertownsend.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 7 | 29 % | 100 % | ✅ |
547 | [Valtech](valtech.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 14 % | 100 % | ✅ | 545 | [Valtech](valtech.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 14 % | 100 % | ✅ |
548 | [Vendeur 3ème Clé (Thirdy Key)](fossil.md) | [`dayforce`](ats-dayforce.md) | 7 | 0 % | 100 % | ✅ | 546 | [Vendeur 3ème Clé (Thirdy Key)](fossil.md) | [`dayforce`](ats-dayforce.md) | 7 | 0 % | 100 % | ✅ |
549 | [Abritek](abritek.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ | 547 | [Abritek](abritek.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ |
@@ -560,7 +558,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
560 | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ | 558 | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ |
561 | [delisoft](delisoft.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ | 559 | [delisoft](delisoft.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ |
562 | [Delmar International](delmar_international_inc.md) | [`workable`](ats-workable.md) | 6 | 0 % | 100 % | ✅ | 560 | [Delmar International](delmar_international_inc.md) | [`workable`](ats-workable.md) | 6 | 0 % | 100 % | ✅ |
563−| [E-Commerce Shipping Associate](slg001.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ |
564 | [Eli Health](eli.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 100 % | ✅ | 561 | [Eli Health](eli.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 100 % | ✅ |
565 | [EMD-Batimo](batimoinc.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | 562 | [EMD-Batimo](batimoinc.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
566 | [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 6 | 0 % | 100 % | ✅ | 563 | [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 6 | 0 % | 100 % | ✅ |
@@ -580,6 +577,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
580 | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ | 577 | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ |
581 | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ | 578 | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
582 | [Place et Forme inc](placeetforme.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 50 % | 50 % | ✅ | 579 | [Place et Forme inc](placeetforme.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 50 % | 50 % | ✅ |
580+| [Porta](porta.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ |
583 | [Prep Academy Tutors](prep_academy_tutors.md) | [`breezy`](ats-breezy.md) | 6 | 0 % | 100 % | ✅ | 581 | [Prep Academy Tutors](prep_academy_tutors.md) | [`breezy`](ats-breezy.md) | 6 | 0 % | 100 % | ✅ |
584 | [Quadra](quadra.md) | [`dayforce`](ats-dayforce.md) | 6 | 100 % | 100 % | ✅ | 582 | [Quadra](quadra.md) | [`dayforce`](ats-dayforce.md) | 6 | 100 % | 100 % | ✅ |
585 | [R&D Partners](rdpartners1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | 583 | [R&D Partners](rdpartners1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
@@ -587,6 +585,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
587 | [ServiceNow](servicenow.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | 585 | [ServiceNow](servicenow.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
588 | [TandemLaunch](tandemlaunch.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ | 586 | [TandemLaunch](tandemlaunch.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ |
589 | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ | 587 | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ |
588+| [Turner & Townsend](turnertownsend.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 33 % | 100 % | ✅ |
590 | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ | 589 | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ |
591 | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ | 590 | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
592 | [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ | 591 | [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ |
@@ -609,6 +608,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
609 | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ | 608 | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ |
610 | [Danaher](danaher.md) | [`workday`](ats-workday.md) | 5 | 60 % | 80 % | ✅ | 609 | [Danaher](danaher.md) | [`workday`](ats-workday.md) | 5 | 60 % | 80 % | ✅ |
611 | [Distro](distro.md) | [`lever`](ats-lever.md) | 5 | 80 % | 100 % | ✅ | 610 | [Distro](distro.md) | [`lever`](ats-lever.md) | 5 | 80 % | 100 % | ✅ |
611+| [E-Commerce Shipping Associate](slg001.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ |
612 | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ | 612 | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ |
613 | [Fastco Canada](fastcocanada.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ | 613 | [Fastco Canada](fastcocanada.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ |
614 | [Fellow Insights Inc.](fellowai.md) | [`ashby`](ats-ashby.md) | 5 | 20 % | 0 % | ✅ | 614 | [Fellow Insights Inc.](fellowai.md) | [`ashby`](ats-ashby.md) | 5 | 20 % | 0 % | ✅ |
@@ -768,7 +768,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
768 | [Robover (ODL Canada)](odl.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ | 768 | [Robover (ODL Canada)](odl.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ |
769 | [RTINGS.com (FR)](laboratoirertingscom.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 33 % | 100 % | ✅ | 769 | [RTINGS.com (FR)](laboratoirertingscom.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 33 % | 100 % | ✅ |
770 | [Sales Consultant Montreal](miele.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ | 770 | [Sales Consultant Montreal](miele.md) | [`workday`](ats-workday.md) | 3 | 100 % | 100 % | ✅ |
771−| [Samsara](samsara.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 100 % | 100 % | ✅ |
772 | [Serve Robotics](serverobotics.md) | [`ashby`](ats-ashby.md) | 3 | 100 % | 0 % | ✅ | 771 | [Serve Robotics](serverobotics.md) | [`ashby`](ats-ashby.md) | 3 | 100 % | 0 % | ✅ |
773 | [SharkNinja](sharkninjaoperatingllc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 100 % | 100 % | ✅ | 772 | [SharkNinja](sharkninjaoperatingllc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 100 % | 100 % | ✅ |
774 | [Shearwater](shearwater.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ | 773 | [Shearwater](shearwater.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ |
@@ -853,6 +852,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
853 | [Playmind](playmind.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 0 % | 100 % | ✅ | 852 | [Playmind](playmind.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 0 % | 100 % | ✅ |
854 | [Poka FR](pokafr.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 0 % | 100 % | ✅ | 853 | [Poka FR](pokafr.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 0 % | 100 % | ✅ |
855 | [Rmldb](rmldb.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ | 854 | [Rmldb](rmldb.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ |
855+| [Samsara](samsara.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 100 % | 100 % | ✅ |
856 | [Santropol Roulant](santropolroulant.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 50 % | 100 % | ✅ | 856 | [Santropol Roulant](santropolroulant.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 50 % | 100 % | ✅ |
857 | [SBM Management](sbmmanagement.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ | 857 | [SBM Management](sbmmanagement.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ |
858 | [Sense Ingénierie](sense_engineering.md) | [`breezy`](ats-breezy.md) | 2 | 0 % | 100 % | ✅ | 858 | [Sense Ingénierie](sense_engineering.md) | [`breezy`](ats-breezy.md) | 2 | 0 % | 100 % | ✅ |
@@ -1031,7 +1031,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
1031 | [Tristan Fleet](tristan_fleet_1.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ | 1031 | [Tristan Fleet](tristan_fleet_1.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ |
1032 | [Trisura](trisura.md) | [`dayforce`](ats-dayforce.md) | 1 | 0 % | 100 % | ✅ | 1032 | [Trisura](trisura.md) | [`dayforce`](ats-dayforce.md) | 1 | 0 % | 100 % | ✅ |
1033 | [Tyco](tyco.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ | 1033 | [Tyco](tyco.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
1034−| [Téléfilm Canada](telefilmcanada.md) | [`dayforce`](ats-dayforce.md) | 1 | 0 % | 100 % | ✅ |
1035 | [Uber Freight](uberfreight.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ | 1034 | [Uber Freight](uberfreight.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ |
1036 | [Urbania](urbania.md) | [`breezy`](ats-breezy.md) | 1 | 0 % | 100 % | ✅ | 1035 | [Urbania](urbania.md) | [`breezy`](ats-breezy.md) | 1 | 0 % | 100 % | ✅ |
1037 | [Vaco by Highspring](vaco.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ | 1036 | [Vaco by Highspring](vaco.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ |
@@ -1155,6 +1154,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
1155 | [Trueline](trueline.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ | 1154 | [Trueline](trueline.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ |
1156 | [TruGreen](trugreen.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ | 1155 | [TruGreen](trugreen.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ |
1157 | [Trupanion](trupanion1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ | 1156 | [Trupanion](trupanion1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ |
1157+| [Téléfilm Canada](telefilmcanada.md) | [`dayforce`](ats-dayforce.md) | 0 | — | — | ✅ |
1158 | [USA Mechanical & Energy Services](usamechasp.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ | 1158 | [USA Mechanical & Energy Services](usamechasp.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
1159 | [VA Desk](vadesk.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ | 1159 | [VA Desk](vadesk.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ |
1160 | [Valard Construction](valard_construction_lp.md) | [`workable`](ats-workable.md) | 0 | — | — | ✅ | 1160 | [Valard Construction](valard_construction_lp.md) | [`workable`](ats-workable.md) | 0 | — | — | ✅ |
modified docs/connecteurs/ats-adp.md +18 −18
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/ats-adp.md 6 Fichier : docs/connecteurs/ats-adp.md
7 Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants 7 Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants
8−Généré : 2026-10-31 13:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-11-01 01:53 EST par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
@@ -40,23 +40,23 @@ Généré : 2026-10-31 13:33 EDT par scripts/gen_connector_docs.py — NE PAS
40 40
41 | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK | 41 | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
42 |---|---|---|---|---|---|---| 42 |---|---|---|---|---|---|---|
43−| [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 12:47 | ✅ | 43+| [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-11-01 01:31 | ✅ |
44−| [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 16 | 25 % | 100 % | 0 % | 2026-10-31 12:05 | ✅ | 44+| [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 16 | 25 % | 100 % | 0 % | 2026-11-01 01:49 | ✅ |
45−| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 12:47 | ✅ | 45+| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-11-01 01:31 | ✅ |
46−| [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ | 46+| [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-11-01 01:35 | ✅ |
47−| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:08 | ✅ | 47+| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-11-01 01:52 | ✅ |
48−| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 12:42 | ✅ | 48+| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-11-01 01:26 | ✅ |
49−| [Quincaillerie Richelieu](richelieu.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:36 | ✅ | 49+| [Quincaillerie Richelieu](richelieu.md) | 9 | 0 % | 100 % | 0 % | 2026-11-01 01:20 | ✅ |
50−| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 11:40 | ✅ | 50+| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-11-01 01:20 | ✅ |
51−| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 12:28 | ✅ | 51+| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-11-01 01:11 | ✅ |
52−| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 11:34 | ✅ | 52+| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-11-01 01:14 | ✅ |
53−| [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ | 53+| [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-11-01 01:36 | ✅ |
54−| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 11:41 | ✅ | 54+| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-11-01 01:52 | ✅ |
55−| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:28 | ✅ | 55+| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-11-01 01:11 | ✅ |
56−| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 12:31 | ✅ | 56+| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-11-01 01:14 | ✅ |
57−| [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 13:33 | ✅ | 57+| [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-11-01 01:12 | ✅ |
58−| [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:46 | ✅ | 58+| [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-11-01 01:30 | ✅ |
59−| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 12:29 | ✅ | 59+| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-11-01 01:12 | ✅ |
60 60
61 ## Licence / conformité 61 ## Licence / conformité
62 62
modified docs/connecteurs/canadian_royalties.md +16 −15
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/canadian_royalties.md 6 Fichier : docs/connecteurs/canadian_royalties.md
7 Rôle : Fiche connecteur — Canadian Royalties (employeur direct, ATS adp) 7 Rôle : Fiche connecteur — Canadian Royalties (employeur direct, ATS adp)
8−Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-11-01 01:53 EST par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 relancer le script pour régénérer. 9 relancer le script pour régénérer.
10 ============================================================================= 10 =============================================================================
11 --> 11 -->
@@ -38,7 +38,7 @@ Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS
38 38
39 ## Champs → schéma 39 ## Champs → schéma
40 40
41−Complétude mesurée sur les **15 offres actives** de la source (base live, 2026-10-14 18:40 EDT). 41+Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-11-01 01:53 EST).
42 42
43 | Champ (`jobs.*`) | Rôle | Complétude | 43 | Champ (`jobs.*`) | Rôle | Complétude |
44 |---|---|---| 44 |---|---|---|
@@ -51,20 +51,20 @@ Complétude mesurée sur les **15 offres actives** de la source (base live, 2026
51 | `address` — Adresse | adresse du lieu de travail | 0 % | 51 | `address` — Adresse | adresse du lieu de travail | 0 % |
52 | `postal_code` — Code postal | code postal si publié | 100 % | 52 | `postal_code` — Code postal | code postal si publié | 100 % |
53 | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % | 53 | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54−| `employment_type` — Type | temps_plein / temps_partiel / … | 93 % | 54+| `employment_type` — Type | temps_plein / temps_partiel / … | 80 % |
55−| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 53 % | 55+| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 40 % |
56−| `salary_label` — Libellé salaire | texte salarial original | 47 % | 56+| `salary_label` — Libellé salaire | texte salarial original | 20 % |
57 | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % | 57 | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % | 58 | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
59 | `date_posted` — Date de parution | ISO 8601 | 100 % | 59 | `date_posted` — Date de parution | ISO 8601 | 100 % |
60 | `date_deadline` — Date limite | date limite pour postuler | 0 % | 60 | `date_deadline` — Date limite | date limite pour postuler | 0 % |
61−| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 93 % | 61+| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % |
62 | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % | 62 | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % |
63 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % | 63 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % |
64 | `apply_url` — Candidature | lien de candidature directe | 0 % | 64 | `apply_url` — Candidature | lien de candidature directe | 0 % |
65 | `gps` — GPS | lat/lng (géocodage sans invention) | 100 % | 65 | `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
66 66
67−Exemple réel : *MI26-61 Mineur·e Production S/T classe 2 -Dynamiteur·rice* — Salluit · taux horaire de 44,71 $ · parue le 2026-10-14. 67+Exemple réel : *ME26-08 Électricien·ne* — Salluit · Taux Horaire variant de 44,56$ à 50,36$ · parue le 2026-10-21.
68 68
69 ## Fréquence & budgets 69 ## Fréquence & budgets
70 70
@@ -79,15 +79,15 @@ Exemple réel : *MI26-61 Mineur·e Production S/T classe 2 -Dynamiteur·rice*
79 79
80 ## Volumétrie & complétude live 80 ## Volumétrie & complétude live
81 81
82−*(mesuré le 2026-10-14 18:40 EDT dans `data/jobka.db`)* 82+*(mesuré le 2026-11-01 01:53 EST dans `data/jobka.db`)*
83 83
84−- **Offres en base** : 43 (dont **15 actives**, 0 masquées comme doublons `dup_of`) 84+- **Offres en base** : 45 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
85−- **Salaire** : 8/15 actives (53 %) 85+- **Salaire** : 2/5 actives (40 %)
86−- **GPS** : 15/15 actives (100 %) 86+- **GPS** : 5/5 actives (100 %)
87−- **Mode** : 0/15 actives (0 %) 87+- **Mode** : 0/5 actives (0 %)
88−- **Parution** : 15/15 actives (100 %) 88+- **Parution** : 5/5 actives (100 %)
89−- **Dernier sync** : 2026-10-14 18:17 — trouvées 15, +0, ~0, -0 89+- **Dernier sync** : 2026-11-01 01:52 — trouvées 5, +0, ~0, -0
90−- **Syncs enregistrés** (`sync_log`) : 549 90+- **Syncs enregistrés** (`sync_log`) : 796
91 91
92 ## Erreurs & dépannage 92 ## Erreurs & dépannage
93 93
@@ -95,6 +95,7 @@ Erreurs relevées dans `sync_log` :
95 95
96 | Erreur | Occurrences | Dernière fois | 96 | Erreur | Occurrences | Dernière fois |
97 |---|---|---| 97 |---|---|---|
98+| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 7 | 2026-11-01 01:26 |
98 | Expecting value: line 1 column 1 (char 0) | 4 | 2026-08-30 01:10 | 99 | Expecting value: line 1 column 1 (char 0) | 4 | 2026-08-30 01:10 |
99 100
100 - Rejouer un sync isolé : `.venv/bin/python run.py sync canadian_royalties` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='canadian_royalties' ORDER BY ts DESC LIMIT 5;"` 101 - Rejouer un sync isolé : `.venv/bin/python run.py sync canadian_royalties` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='canadian_royalties' ORDER BY ts DESC LIMIT 5;"`
modified jobka/connectors/canadian_royalties.py +171 −4
@@ -2,11 +2,65 @@
2 # Job·Ka — Groupe KA 2 # Job·Ka — Groupe KA
3 # Auteur : Simon-Pierre Boucher 3 # Auteur : Simon-Pierre Boucher
4 # Contact : contact@spboucher.ai 4 # Contact : contact@spboucher.ai
5−# Fichier : jobka/connectors/jobka/connectors/canadian_royalties.py 5+# Fichier : jobka/connectors/canadian_royalties.py
6−# Rôle : Connecteur Canadian Royalties — mines Nunavik (nickel-cuivre) — ADP WFN 6+# Rôle : Connecteur Canadian Royalties — mines Nunavik (nickel-cuivre) —
7−# Créé : 2026-08-25 Modifié : 2026-08-25 7+# ADP WFN + repli « détail seulement » quand l'API liste échoue
8+# (maintenances nocturnes ADP) + garde-fou retry borné (frontal
9+# ADP intermittent par cid)
10+# Créé : 2026-08-25 Modifié : 2026-11-01
8 # ============================================================================= 11 # =============================================================================
9−from .adp import ADPWorkforceNowConnector 12+"""Canadian Royalties — ADP Workforce Now, avec repli de revalidation.
13+
14+Chronologie (mission ka6 2026-11-01) : 9e tenant ADP de l'app touché par le
15+frontal intermittent PAR CID (même panne que bento_sushi 64f53c8f, cookit
16+7873198d, mitsubishi_hc_capital du 2026-10-26, niobec 61a2ddf8,
17+osgoode_properties 3b95c432, uv_assurance 946898d9, strathmore b6b8f9fc et
18+nemaska_lithium 3b8c1750 — pool backend malade côté ADP, « default backend -
19+404 » nginx). Vert found=5/6 en continu (= la médiane 5.0), puis 404 francs
20+sur la liste fr_CA à 01:18, 04:42 et 04:56 le 31/10 (épisode nocturne
21+multi-tenants 23:45→04:42) ; reverdi seul à 08:25, NOUVEAUX 404 isolés à
22+10:48 et 18:19 (reverdi entre les deux), dernier vert found=5 à 20:42, puis
23+404 à 23:03 et 01:26 → stale. Sonde live 01:4x le 01/11 : sur 6 essais sur
24+la MÊME URL liste à la même minute, 1 × 200 JSON (totalNumber=5) et 5 ×
25+« default backend - 404 » de 21 octets — intermittence, tenant VIVANT,
26+aucune migration. Garde-fou répliqué des huit frères : `_get_json` retente
27+jusqu'à 30 fois (pause 2 s) sur 404/502/503/504/timeout/non-JSON, timeout
28+abaissé 30→15 s pour borner les connexions qui pendent. Dormant dès que le
29+frontal est sain (1er essai OK = zéro surcoût) ; un sync vert ne coûte
30+qu'UN appel liste (détails en cache BD). NE PAS retirer ce garde-fou si un
31+futur scan le croise : il est inerte hors panne. Il couvre liste ET détail
32+(_fetch_detail passe par _get_json) ; le repli « détail seulement »
33+ci-dessous reste la défense contre les maintenances totales sorry.adp.com.
34+
35+Contexte (2026-08-29/30) : ADP Workforce Now a des fenêtres de maintenance
36+nocturnes récurrentes (vendredi ET samedi soir ~22:00 → 02:00 ET) pendant
37+lesquelles TOUT workforcenow.adp.com redirige vers sorry.adp.com — la liste
38+job-requisitions renvoie alors du HTML, d'où les 4 « Expecting value: line 1
39+column 1 » relevés dans le sync_log de ce tenant fin août. Comme le cycle
40+complet met ~3 h entre deux passages de la source, un seul passage raté
41+pendant la fenêtre suffit à dépasser le seuil stale de 4 h.
42+
43+D'où le repli ci-dessous (même pattern que cultures_genv.py /
44+groupe_nordik.py / h2o_innovation.py / mitsubishi_hc_capital.py /
45+msi_gestion.py / ciena.py / strathmore.py / nemaska_lithium.py) : si la
46+pagination liste échoue en 5xx ou en non-JSON, on revalide une à une les
47+offres actives connues en base via l'API détail job-requisitions/<itemID>
48+(qui renvoie la réquisition complète : titre, date, lieux, description).
49+Aucune donnée inventée — tout vient de la réponse live. Une offre en 404 est
50+considérée retirée. Si AUCUNE offre n'est validable (maintenance totale : le
51+détail redirige aussi vers sorry.adp.com), l'erreur d'origine est propagée
52+pour que le sync reste un échec (inventaire préservé). Limite assumée : le
53+repli ne découvre pas les NOUVELLES offres — le chemin liste normal reprend
54+seul au cycle suivant la fin de la maintenance.
55+"""
56+from __future__ import annotations
57+
58+import time
59+
60+import requests
61+
62+from ..schema import JobPosting, clean_html
63+from .adp import _API, ADPWorkforceNowConnector
10 64
11 65
12 class CanadianRoyaltiesConnector(ADPWorkforceNowConnector): 66 class CanadianRoyaltiesConnector(ADPWorkforceNowConnector):
@@ -14,3 +68,116 @@ class CanadianRoyaltiesConnector(ADPWorkforceNowConnector):
14 EMPLOYER = "Canadian Royalties" 68 EMPLOYER = "Canadian Royalties"
15 CID = "4931992c-7d5c-476d-a1ae-432575ceaa10" 69 CID = "4931992c-7d5c-476d-a1ae-432575ceaa10"
16 CCID = "19000101_000001" 70 CCID = "19000101_000001"
71+
72+ # Frontal ADP intermittent pour CE tenant (2026-11-01) : mêmes bornes que
73+ # bento_sushi/cookit/mitsubishi_hc_capital/niobec/osgoode_properties/
74+ # uv_assurance/strathmore/nemaska_lithium — les 404 échouent vite (<1 s),
75+ # le timeout court borne les connexions qui pendent, et un sync vert ne
76+ # coûte qu'UN appel liste (détails en cache BD).
77+ timeout = 15
78+ _FLAKY_TRIES = 30
79+ _FLAKY_PAUSE = 2.0
80+
81+ def _get_json(self, url: str, params: dict) -> dict:
82+ last: Exception | None = None
83+ for attempt in range(self._FLAKY_TRIES):
84+ if attempt:
85+ time.sleep(self._FLAKY_PAUSE)
86+ try:
87+ return super()._get_json(url, params)
88+ except requests.HTTPError as exc:
89+ status = getattr(exc.response, "status_code", None)
90+ if status not in (404, 502, 503, 504):
91+ raise
92+ last = exc
93+ except (requests.Timeout, requests.ConnectionError) as exc:
94+ last = exc
95+ except RuntimeError as exc:
96+ # « ADP non-JSON après 3 essais » de la classe de base :
97+ # même frontal malade, même traitement.
98+ if not str(exc).startswith("ADP non-JSON"):
99+ raise
100+ last = exc
101+ raise last
102+
103+ def fetch(self) -> list[JobPosting]:
104+ try:
105+ return super().fetch()
106+ except (requests.RequestException, ValueError) as exc:
107+ resp = getattr(exc, "response", None)
108+ if resp is not None and resp.status_code < 500:
109+ raise # 4xx franc : pas une panne liste, ne pas masquer
110+ jobs = self._fetch_known_jobs()
111+ if jobs is None:
112+ raise # API détail cassée aussi : vraie panne totale
113+ return jobs
114+
115+ def _known_ids(self) -> list[str]:
116+ """itemID (external_id) des offres actives de la source en base."""
117+ from .. import db
118+ con = db.connect()
119+ try:
120+ rows = con.execute(
121+ "SELECT external_id FROM jobs WHERE source=? AND active=1",
122+ (self.source_id,)).fetchall()
123+ finally:
124+ con.close()
125+ return [str(eid) for (eid,) in rows if eid]
126+
127+ def _fetch_known_jobs(self) -> list[JobPosting] | None:
128+ """Repli sans liste : chaque offre connue est revalidée via l'API
129+ détail (la réquisition complète, source de vérité de son existence).
130+ Aucune donnée inventée — tout vient de la réponse du moment."""
131+ out: list[JobPosting] = []
132+ errors = 0
133+ for iid in self._known_ids():
134+ try:
135+ r = self.get(f"{_API}/{iid}", params=self._params(),
136+ headers={"Accept": "application/json"}).json()
137+ except requests.HTTPError as exc:
138+ h = getattr(exc, "response", None)
139+ if h is not None and h.status_code == 404:
140+ continue # offre retirée chez l'employeur
141+ errors += 1
142+ continue
143+ except (requests.RequestException, ValueError):
144+ errors += 1 # non-JSON (maintenance) ou réseau
145+ continue
146+ if not (r or {}).get("requisitionTitle"):
147+ errors += 1 # réponse inattendue : ne pas conclure au retrait
148+ continue
149+ locations = self._locations(r)
150+ if not self._keep(locations):
151+ continue
152+ qc = next((l for l in locations
153+ if l["prov"].upper() == "QC"),
154+ locations[0] if locations else
155+ {"city": self.FORCE_CITY, "postal": "",
156+ "label": self.FORCE_CITY})
157+ job = JobPosting(
158+ source=self.source_id, external_id=iid,
159+ url=("https://workforcenow.adp.com/mascsr/default/mdf/"
160+ f"recruitment/recruitment.html?cid={self.CID}"
161+ f"&ccId={self.CCID}&lang={self.LANG}&jobId={iid}"),
162+ employer=self.EMPLOYER,
163+ title=r.get("requisitionTitle") or "",
164+ city=qc["city"], postal_code=qc["postal"],
165+ location_label=qc["label"],
166+ date_posted=r.get("postDate") or None,
167+ ats=self.ats,
168+ )
169+ pay = r.get("payGradeRange") or {}
170+ lo = (pay.get("minimumRate") or {}).get("amountValue")
171+ hi = (pay.get("maximumRate") or {}).get("amountValue")
172+ if lo:
173+ job.salary_min = float(lo)
174+ job.salary_max = float(hi) if hi else None
175+ job.salary_unit = "year" if float(lo) > 5000 else "hour"
176+ wl = (r.get("workLevelCode") or {}).get("shortName")
177+ if wl:
178+ job.details["employment_label"] = wl
179+ job.description = clean_html(r.get("requisitionDescription") or "")
180+ out.append(job)
181+ if not out and errors:
182+ return None # rien de validable : laisser le sync échouer
183+ return out
17 184
Menu

Theme