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 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-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 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-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 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 23 | Plateforme | Employeurs | Actives | Salaire | GPS |
24 24 |---|---|---|---|---|
25 −| [`workday`](ats-workday.md) | 232 | 7347 | 47 % | 88 % |
26 −| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2894 | 16 % | 99 % |
25 +| [`workday`](ats-workday.md) | 232 | 7337 | 47 % | 88 % |
26 +| [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2893 | 16 % | 99 % |
27 27 | [`workable`](ats-workable.md) | 71 | 1993 | 17 % | 100 % |
28 −| [`dayforce`](ats-dayforce.md) | 129 | 1899 | 10 % | 100 % |
29 −| [`successfactors`](ats-successfactors.md) | 12 | 1639 | 19 % | 99 % |
30 −| [`njoyn`](ats-njoyn.md) | 11 | 1265 | 69 % | 87 % |
31 −| [`workland`](ats-workland.md) | 1 | 1106 | 37 % | 100 % |
32 −| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 805 | 6 % | 100 % |
33 −| [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % |
28 +| [`dayforce`](ats-dayforce.md) | 129 | 1897 | 10 % | 100 % |
29 +| [`successfactors`](ats-successfactors.md) | 12 | 1637 | 19 % | 99 % |
30 +| [`njoyn`](ats-njoyn.md) | 11 | 1266 | 69 % | 87 % |
31 +| [`workland`](ats-workland.md) | 1 | 1140 | 36 % | 100 % |
32 +| [`greenhouse`](ats-greenhouse.md) | 132 | 791 | 19 % | 100 % |
33 +| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 765 | 6 % | 100 % |
34 34 | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % |
35 35 | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % |
36 36 | [`ashby`](ats-ashby.md) | 41 | 308 | 54 % | 57 % |
37 37 | [`recruitee`](ats-recruitee.md) | 30 | 280 | 21 % | 97 % |
38 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 40 | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % |
41 41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 144 | 14 % | 86 % |
42 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 55 | Source | Actives | Salaire | Dernier sync |
56 56 |---|---|---|---|
57 −| [Espresso-Jobs](espresso_jobs.md) | 157 | 22 % | 2026-10-31 11:59 |
58 −| [Guichet-Emplois (Canada)](guichet_emplois.md) | 501 | 100 % | 2026-10-31 12:08 |
59 −| [Jobillico](jobillico.md) | 1976 | 34 % | 2026-10-31 12:21 |
57 +| [Espresso-Jobs](espresso_jobs.md) | 156 | 22 % | 2026-11-01 01:45 |
58 +| [Guichet-Emplois (Canada)](guichet_emplois.md) | 502 | 100 % | 2026-11-01 01:52 |
59 +| [Jobillico](jobillico.md) | 1221 | 30 % | 2026-11-01 01:04 |
60 60 | [Dépôt direct employeurs](depot-direct.md) | 0 (0 en modération) | — | au fil de l'eau |
61 61
62 62 ## Employeurs directs (par volume d'offres actives)
63 63
64 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 67 | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 984 | 70 % | 67 % | ✅ |
68 68 | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 959 | 23 % | 100 % | ✅ |
69 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 71 | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 817 | 98 % | 98 % | ✅ |
72 72 | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ |
73 −| [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 395 | 82 % | 100 % | ✅ |
74 −| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 298 | 0 % | 94 % | ✅ |
73 +| [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 396 | 82 % | 100 % | ✅ |
74 +| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 299 | 0 % | 94 % | ✅ |
75 75 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ |
76 76 | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 276 | 1 % | 92 % | ✅ |
77 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 82 | [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 208 | 4 % | 100 % | ✅ |
83 83 | [Globalhr](globalhr.md) | [`workday`](ats-workday.md) | 207 | 0 % | 82 % | ✅ |
84 84 | [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 204 | 20 % | 100 % | ✅ |
85 −| [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 184 | 94 % | 96 % | ✅ |
86 −| [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 175 | 2 % | 100 % | ✅ |
87 −| [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 153 | 5 % | 100 % | ✅ |
85 +| [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 182 | 94 % | 96 % | ✅ |
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) | 152 | 5 % | 100 % | ✅ |
88 88 | [Le Groupe Maurice](groupemaurice.md) | [`dayforce`](ats-dayforce.md) | 148 | 0 % | 100 % | ✅ |
89 89 | [CISSS de l'Abitibi-Témiscamingue](cisss_abitibi.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 144 | 0 % | 100 % | ✅ |
90 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 91 | [Consignaction (AQRCB)](consignaction.md) | [`workday`](ats-workday.md) | 132 | 86 % | 100 % | ✅ |
93 92 | [Vetstrategy](vetstrategy.md) | [`dayforce`](ats-dayforce.md) | 132 | 2 % | 100 % | ✅ |
94 93 | [Deloitte Canada](deloitte.md) | [`successfactors`](ats-successfactors.md) | 131 | 98 % | 100 % | ✅ |
95 94 | [Ubisoft](ubisoft.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 122 | 0 % | 100 % | ✅ |
96 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 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 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 100 | [Groupe Helios](groupehelios.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 103 | 3 % | 100 % | ✅ |
101 101 | [Dentalcorp](dentalcorp.md) | [`workday`](ats-workday.md) | 102 | 16 % | 100 % | ✅ |
102 102 | [CISSS de Lanaudière](cisss_lanaudiere.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 98 | 10 % | 100 % | ✅ |
103 103 | [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 97 | 0 % | 100 % | ✅ |
104 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 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 107 | [HIKINEX](recruiting.md) | [`breezy`](ats-breezy.md) | 91 | 0 % | 100 % | ✅ |
108 108 | [Artelia Canada](artelia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 90 | 0 % | 100 % | ✅ |
109 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 119 | [Norda Stelo](nordastelo.md) | [`teamtailor`](ats-teamtailor.md) | 72 | 0 % | 97 % | ✅ |
120 120 | [Banque CIBC](cibc.md) | [`workday`](ats-workday.md) | 71 | 0 % | 100 % | ✅ |
121 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 123 | [Gray Collection (Groupe Antonopoulos)](graycollection.md) | [`dayforce`](ats-dayforce.md) | 66 | 0 % | 100 % | ✅ |
123 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 125 | [Lifeworks](lifeworks.md) | [`workday`](ats-workday.md) | 61 | 28 % | 87 % | ✅ |
126 126 | [Kiewit (Ganotec)](kiewit_ganotec.md) | [`successfactors`](ats-successfactors.md) | 60 | 0 % | 100 % | ✅ |
127 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 218 | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ |
219 219 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ |
220 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 221 | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ |
223 222 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ |
224 223 | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ |
225 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 225 | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 24 | 83 % | 100 % | ✅ |
228 226 | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ |
229 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 232 | [OSEDEA](osedea.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ |
235 233 | [Sanimax](sanimax.md) | [`workday`](ats-workday.md) | 24 | 25 % | 100 % | ✅ |
236 234 | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 24 | 0 % | 100 % | ✅ |
235 +| [Sun Life](sunlife.md) | [`workday`](ats-workday.md) | 24 | 29 % | 83 % | ✅ |
237 236 | [Airliquidehr](airliquidehr.md) | [`workday`](ats-workday.md) | 23 | 22 % | 100 % | ✅ |
238 237 | [Broccolini](broccolini.md) | [`bamboohr`](ats-bamboohr.md) | 23 | 4 % | 100 % | ✅ |
238 +| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 23 | 4 % | 100 % | ✅ |
239 239 | [Cineplex](cineplex.md) | [`workday`](ats-workday.md) | 23 | 0 % | 96 % | ✅ |
240 240 | [MEDFAR Solutions Cliniques](medfar.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ |
241 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 283 | [Xsolla](xsolla.md) | [`lever`](ats-lever.md) | 19 | 100 % | 95 % | ✅ |
284 284 | [ALS Global](alsglobal.md) | [`workday`](ats-workday.md) | 18 | 6 % | 94 % | ✅ |
285 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 287 | [CONTRÔLEUR](novatech.md) | [`dayforce`](ats-dayforce.md) | 18 | 39 % | 100 % | ✅ |
288 288 | [KDC/ONE](kdcone.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ |
289 289 | [Onelineage](onelineage.md) | [`workday`](ats-workday.md) | 18 | 6 % | 100 % | ✅ |
290 290 | [Pré-assemblage](motionc.md) | [`dayforce`](ats-dayforce.md) | 18 | 0 % | 100 % | ✅ |
291 291 | [REXEL](rexel1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 0 % | 100 % | ✅ |
292 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 293 | [Vooban](vooban.md) | [`greenhouse`](ats-greenhouse.md) | 18 | 0 % | 100 % | ✅ |
295 294 | [Wabtec](wabtec.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 18 | 22 % | 100 % | ✅ |
296 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 312 | [Défis RH](defisrh.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 44 % | 94 % | ✅ |
314 313 | [Egis Group](egisgroup.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 16 | 0 % | 100 % | ✅ |
315 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 316 | [McGill St Laurent](mcgillstlaurentb8.md) | [`lever`](ats-lever.md) | 16 | 0 % | 100 % | ✅ |
317 317 | [Réseau de transport de la Capitale](rtc_quebec.md) | [`njoyn`](ats-njoyn.md) | 16 | 0 % | 0 % | ✅ |
318 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 320 | [Avocat·e, Bureau de l'avocate générale](mthris.md) | [`dayforce`](ats-dayforce.md) | 15 | 33 % | 100 % | ✅ |
320 321 | [Boralex](boralex.md) | [`dayforce`](ats-dayforce.md) | 15 | 0 % | 100 % | ✅ |
321 322 | [GSK](gsk.md) | [`workday`](ats-workday.md) | 15 | 13 % | 100 % | ✅ |
322 −| [Jci](jci.md) | [`workday`](ats-workday.md) | 15 | 100 % | 100 % | ✅ |
323 323 | [La Senza](lasenza.md) | [`greenhouse`](ats-greenhouse.md) | 15 | 13 % | 100 % | ✅ |
324 324 | [Mila — Institut québécois d'IA](mila_2.md) | [`workable`](ats-workable.md) | 15 | 0 % | 100 % | ✅ |
325 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 538 | [Mistral AI](mistral_ai.md) | [`ashby`](ats-ashby.md) | 7 | 0 % | 71 % | ✅ |
539 539 | [Novisto](novisto78.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 0 % | 100 % | ✅ |
540 540 | [Nutreco](nutreco.md) | [`workday`](ats-workday.md) | 7 | 14 % | 100 % | ✅ |
541 −| [Porta](porta.md) | [`dayforce`](ats-dayforce.md) | 7 | 29 % | 100 % | ✅ |
542 541 | [Scotts Canada (Fafard)](scottsmiraclegro.md) | [`workday`](ats-workday.md) | 7 | 0 % | 100 % | ✅ |
543 542 | [Surmesur](surmesur.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 86 % | 100 % | ✅ |
544 543 | [Telesat](telesat.md) | [`lever`](ats-lever.md) | 7 | 0 % | 100 % | ✅ |
545 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 545 | [Valtech](valtech.md) | [`greenhouse`](ats-greenhouse.md) | 7 | 14 % | 100 % | ✅ |
548 546 | [Vendeur 3ème Clé (Thirdy Key)](fossil.md) | [`dayforce`](ats-dayforce.md) | 7 | 0 % | 100 % | ✅ |
549 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 558 | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ |
561 559 | [delisoft](delisoft.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ |
562 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 561 | [Eli Health](eli.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 100 % | ✅ |
565 562 | [EMD-Batimo](batimoinc.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
566 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 577 | [Oldcastle BuildingEnvelope](oldcastlebuildingenvelope.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ |
581 578 | [PEAK Groupe financier](peakgroup.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
582 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 581 | [Prep Academy Tutors](prep_academy_tutors.md) | [`breezy`](ats-breezy.md) | 6 | 0 % | 100 % | ✅ |
584 582 | [Quadra](quadra.md) | [`dayforce`](ats-dayforce.md) | 6 | 100 % | 100 % | ✅ |
585 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 585 | [ServiceNow](servicenow.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
588 586 | [TandemLaunch](tandemlaunch.md) | [`greenhouse`](ats-greenhouse.md) | 6 | 0 % | 100 % | ✅ |
589 587 | [Terrapure](terrapure.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ |
588 +| [Turner & Townsend](turnertownsend.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 33 % | 100 % | ✅ |
590 589 | [Weir Group](weir.md) | [`workday`](ats-workday.md) | 6 | 17 % | 67 % | ✅ |
591 590 | [Yaksa](yaksa.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
592 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 608 | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ |
610 609 | [Danaher](danaher.md) | [`workday`](ats-workday.md) | 5 | 60 % | 80 % | ✅ |
611 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 612 | [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 5 | 80 % | 60 % | ✅ |
613 613 | [Fastco Canada](fastcocanada.md) | [`dayforce`](ats-dayforce.md) | 5 | 0 % | 100 % | ✅ |
614 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 768 | [Robover (ODL Canada)](odl.md) | [`workday`](ats-workday.md) | 3 | 0 % | 100 % | ✅ |
769 769 | [RTINGS.com (FR)](laboratoirertingscom.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 33 % | 100 % | ✅ |
770 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 771 | [Serve Robotics](serverobotics.md) | [`ashby`](ats-ashby.md) | 3 | 100 % | 0 % | ✅ |
773 772 | [SharkNinja](sharkninjaoperatingllc.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 100 % | 100 % | ✅ |
774 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 852 | [Playmind](playmind.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 0 % | 100 % | ✅ |
854 853 | [Poka FR](pokafr.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 0 % | 100 % | ✅ |
855 854 | [Rmldb](rmldb.md) | [`dayforce`](ats-dayforce.md) | 2 | 0 % | 100 % | ✅ |
855 +| [Samsara](samsara.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 100 % | 100 % | ✅ |
856 856 | [Santropol Roulant](santropolroulant.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 50 % | 100 % | ✅ |
857 857 | [SBM Management](sbmmanagement.md) | [`workday`](ats-workday.md) | 2 | 100 % | 50 % | ✅ |
858 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 1031 | [Tristan Fleet](tristan_fleet_1.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ |
1032 1032 | [Trisura](trisura.md) | [`dayforce`](ats-dayforce.md) | 1 | 0 % | 100 % | ✅ |
1033 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 1034 | [Uber Freight](uberfreight.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ |
1036 1035 | [Urbania](urbania.md) | [`breezy`](ats-breezy.md) | 1 | 0 % | 100 % | ✅ |
1037 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 1154 | [Trueline](trueline.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ |
1156 1155 | [TruGreen](trugreen.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ |
1157 1156 | [Trupanion](trupanion1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ |
1157 +| [Téléfilm Canada](telefilmcanada.md) | [`dayforce`](ats-dayforce.md) | 0 | — | — | ✅ |
1158 1158 | [USA Mechanical & Energy Services](usamechasp.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
1159 1159 | [VA Desk](vadesk.md) | [`breezy`](ats-breezy.md) | 0 | — | — | ✅ |
1160 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 5 Contact : contact@spboucher.ai
6 6 Fichier : docs/connecteurs/ats-adp.md
7 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 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 41 | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
42 42 |---|---|---|---|---|---|---|
43 −| [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 12:47 | ✅ |
44 −| [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 16 | 25 % | 100 % | 0 % | 2026-10-31 12:05 | ✅ |
45 −| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 12:47 | ✅ |
46 −| [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ |
47 −| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:08 | ✅ |
48 −| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 12:42 | ✅ |
49 −| [Quincaillerie Richelieu](richelieu.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:36 | ✅ |
50 −| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 11:40 | ✅ |
51 −| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 12:28 | ✅ |
52 −| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 11:34 | ✅ |
53 −| [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ |
54 −| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 11:41 | ✅ |
55 −| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:28 | ✅ |
56 −| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 12:31 | ✅ |
57 −| [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 13:33 | ✅ |
58 −| [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:46 | ✅ |
59 −| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 12:29 | ✅ |
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-11-01 01:49 | ✅ |
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-11-01 01:35 | ✅ |
47 +| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-11-01 01:52 | ✅ |
48 +| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-11-01 01:26 | ✅ |
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-11-01 01:20 | ✅ |
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-11-01 01:14 | ✅ |
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-11-01 01:52 | ✅ |
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-11-01 01:14 | ✅ |
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-11-01 01:30 | ✅ |
59 +| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-11-01 01:12 | ✅ |
60 60
61 61 ## Licence / conformité
62 62
modified docs/connecteurs/canadian_royalties.md +16 −15
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 5 Contact : contact@spboucher.ai
6 6 Fichier : docs/connecteurs/canadian_royalties.md
7 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 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 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 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 51 | `address` — Adresse | adresse du lieu de travail | 0 % |
52 52 | `postal_code` — Code postal | code postal si publié | 100 % |
53 53 | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 −| `employment_type` — Type | temps_plein / temps_partiel / … | 93 % |
55 −| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 53 % |
56 −| `salary_label` — Libellé salaire | texte salarial original | 47 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 80 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 40 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 20 % |
57 57 | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 58 | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
59 59 | `date_posted` — Date de parution | ISO 8601 | 100 % |
60 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 62 | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % |
63 63 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % |
64 64 | `apply_url` — Candidature | lien de candidature directe | 0 % |
65 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 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 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`)
85 −- **Salaire** : 8/15 actives (53 %)
86 −- **GPS** : 15/15 actives (100 %)
87 −- **Mode** : 0/15 actives (0 %)
88 −- **Parution** : 15/15 actives (100 %)
89 −- **Dernier sync** : 2026-10-14 18:17 — trouvées 15, +0, ~0, -0
90 −- **Syncs enregistrés** (`sync_log`) : 549
84 +- **Offres en base** : 45 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
85 +- **Salaire** : 2/5 actives (40 %)
86 +- **GPS** : 5/5 actives (100 %)
87 +- **Mode** : 0/5 actives (0 %)
88 +- **Parution** : 5/5 actives (100 %)
89 +- **Dernier sync** : 2026-11-01 01:52 — trouvées 5, +0, ~0, -0
90 +- **Syncs enregistrés** (`sync_log`) : 796
91 91
92 92 ## Erreurs & dépannage
93 93
@@ -95,6 +95,7 @@ Erreurs relevées dans `sync_log` :
95 95
96 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 99 | Expecting value: line 1 column 1 (char 0) | 4 | 2026-08-30 01:10 |
99 100
100 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 2 # Job·Ka — Groupe KA
3 3 # Auteur : Simon-Pierre Boucher
4 4 # Contact : contact@spboucher.ai
5 −# Fichier : jobka/connectors/jobka/connectors/canadian_royalties.py
6 −# Rôle : Connecteur Canadian Royalties — mines Nunavik (nickel-cuivre) — ADP WFN
7 −# Créé : 2026-08-25 Modifié : 2026-08-25
5 +# Fichier : jobka/connectors/canadian_royalties.py
6 +# Rôle : Connecteur Canadian Royalties — mines Nunavik (nickel-cuivre) —
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 66 class CanadianRoyaltiesConnector(ADPWorkforceNowConnector):
@@ -14,3 +68,116 @@ class CanadianRoyaltiesConnector(ADPWorkforceNowConnector):
14 68 EMPLOYER = "Canadian Royalties"
15 69 CID = "4931992c-7d5c-476d-a1ae-432575ceaa10"
16 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