SPB Git forge

spb/job-ka

Public
226commits 1branches 0releases
37.5 MBsize
maindefault branch
10 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%

Documentation connecteurs (standard Groupe-KA) + registre de conformité

- scripts/gen_connector_docs.py : générateur rejouable (ast + sources.json +
  BD live en lecture seule + sync_log + git) -> docs/connecteurs/ :
  INDEX.md + 17 fiches plateformes ATS (mécanique, endpoints, budgets,
  tableau des tenants) + 217 fiches employeurs + 3 fiches portails +
  fiche dépôt direct (239 fichiers, sections fixes standardisées)
- docs/CONFORMITE.md : registre de conformité par famille (base d accès,
  attribution/lien candidature vérifié -> offre originale, zéro donnée
  personnelle de candidat, Québec Emploi écarté clicSÉQUR, vérifié 2026-08-18)
- README : section Connecteurs (17 ATS, 217 employeurs directs, 3 portails,
  badge Offre directe, dépôt direct), structure/env/API à jour
- data/sources.json : _meta enrichi (compteurs, liste ATS, pointeurs docs)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 18, 2026) parent 1604ff9

190 changed files +19,920 −18

modified README.md +44 −17
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 5 Contact : contact@spboucher.ai
6 6 Fichier : README.md
7 7 Rôle : Documentation principale du projet
8 −Créé : 2026-08-17 Modifié : 2026-08-17
8 +Créé : 2026-08-17 Modifié : 2026-08-18
9 9 =============================================================================
10 10 -->
11 11
@@ -18,9 +18,10 @@ Créé : 2026-08-17 Modifié : 2026-08-17
18 18 **[www.job-ka.com](https://www.job-ka.com)**
19 19
20 20 *Job·Ka collecte les offres directement sur les pages carrières des employeurs
21 −du Québec — pas sur les job boards. Chaque offre est traçable à sa source,
22 −les salaires sont normalisés en $/h et $/an, et la candidature se fait chez
23 −l'employeur. Zéro boîte noire, zéro intermédiaire.*
21 +du Québec — 217 employeurs branchés sur 17 plateformes ATS, complétés par
22 +3 portails publics (l'offre directe gagne toujours). Chaque offre est
23 +traçable à sa source, les salaires sont normalisés en $/h et $/an, et la
24 +candidature se fait chez l'employeur. Zéro boîte noire, zéro intermédiaire.*
24 25
25 26 </div>
26 27
@@ -31,6 +32,7 @@ l'employeur. Zéro boîte noire, zéro intermédiaire.*
31 32 - [Pourquoi Job·Ka ?](#pourquoi-job-ka-)
32 33 - [L'architecture en 30 secondes](#larchitecture-en-30-secondes)
33 34 - [Le pipeline en détail](#le-pipeline-en-détail)
35 +- [Connecteurs](#connecteurs)
34 36 - [Structure du dépôt](#structure-du-dépôt)
35 37 - [Démarrage rapide](#démarrage-rapide)
36 38 - [CLI `run.py`](#cli-runpy)
@@ -51,8 +53,10 @@ offres mortes. L'offre originale — celle de la page carrière de l'employeur
51 53 est la seule source fiable : à jour, complète, sans frais de mise en avant.
52 54
53 55 > Job·Ka se branche directement sur les systèmes de recrutement (ATS) des
54 −> employeurs : Workday, Lever, Greenhouse, SmartRecruiters, ou leur site
55 −> maison. Un connecteur = un employeur. Le tout resynchronisé jour et nuit.
56 +> employeurs — 17 plateformes : Workday, Lever, Greenhouse, SmartRecruiters,
57 +> BambooHR, Breezy, Recruitee, Ashby, Workable, Taleo, Njoyn, UltiPro,
58 +> iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland. Un
59 +> connecteur = un employeur. Le tout resynchronisé jour et nuit.
56 60
57 61 Ce n'est pas un job board qui vend de la visibilité, c'est un index fidèle de
58 62 ce que les employeurs québécois affichent réellement — **avec les salaires en
@@ -92,11 +96,10 @@ flowchart LR
92 96
93 97 ### Connecteurs auto-découverts
94 98 Toute sous-classe de `BaseConnector` avec un `source_id` est enregistrée par
95 −`pkgutil` — aucun registre à maintenir. Les plateformes ATS (Workday, Lever,
96 −Greenhouse, SmartRecruiters) sont des classes de base : brancher un nouvel
97 −employeur = ~10 lignes. Politesse : throttling par source (`request_delay`),
98 −User-Agent identifiable `JobKaBot/1.0`, budgets de requêtes, cache BD des
99 −pages détail.
99 +`pkgutil` — aucun registre à maintenir. Les 17 plateformes ATS sont des
100 +classes de base : brancher un nouvel employeur = ~10 lignes. Politesse :
101 +throttling par source (`request_delay`), User-Agent identifiable
102 +`JobKaBot/1.0`, budgets de requêtes, cache BD des pages détail.
100 103
101 104 ### Diff engine avec garde-fou anti-dérive
102 105 Chaque sync compare le `content_hash` de chaque offre : ajout, mise à jour, ou
@@ -123,6 +126,28 @@ exigence d'un second signal concordant (type, salaire ±4 %, date ±7 j). Le
123 126 canonique est la source la plus autoritaire (page carrière avant agrégat) ;
124 127 les doublons sont masqués (`dup_of`), jamais supprimés.
125 128
129 +## Connecteurs
130 +
131 +**217 employeurs directs** connectés via **17 plateformes ATS** (Workday,
132 +Lever, Greenhouse, SmartRecruiters, BambooHR, Breezy, Recruitee, Ashby,
133 +Workable, Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital
134 +Recruiters, Workland) + **3 portails agrégateurs** en complément
135 +(Guichet-Emplois — Crawl-delay 5 s respecté —, Jobillico via sitemaps,
136 +Espresso-Jobs) + un **canal de dépôt direct** pour les employeurs
137 +(`/employeurs`, modération manuelle).
138 +
139 +- Les offres issues des pages carrières portent le badge **« Offre
140 + directe »** (`is_direct`) ; la candidature se fait chez l'employeur.
141 +- En cas de doublon entre une offre directe et sa copie portail, **l'offre
142 + directe gagne la canonique** (dédup direct-prioritaire, `dup_of`).
143 +- **Documentation par connecteur** (générée, standard Groupe-KA) :
144 + [`docs/connecteurs/INDEX.md`](docs/connecteurs/INDEX.md) — une fiche par
145 + plateforme ATS, par employeur, par portail et pour le dépôt direct.
146 + Régénérer : `.venv/bin/python scripts/gen_connector_docs.py`.
147 +- **Registre de conformité** : [`docs/CONFORMITE.md`](docs/CONFORMITE.md)
148 + (base d'accès par famille, attribution, zéro donnée personnelle de
149 + candidat ; Québec Emploi écarté — auth clicSÉQUR).
150 +
126 151 ## Structure du dépôt
127 152
128 153 ```
@@ -141,15 +166,15 @@ job-ka/
141 166 │ └── connectors/
142 167 │ ├── base.py # BaseConnector (throttling, Scrapfly, cache détail)
143 168 │ ├── workday.py # plateforme Workday (facette Québec auto-découverte)
144 −│ ├── lever.py # plateforme Lever
145 −│ ├── greenhouse.py # plateforme Greenhouse
146 −│ ├── smartrecruiters.py # plateforme SmartRecruiters
147 −│ └── <employeur>.py # 1 fichier = 1 employeur (sous-classe)
148 −├── data/sources.json # registre descriptif des employeurs
169 +│ ├── <ats>.py # 16 autres plateformes ATS partagées
170 +│ ├── guichet_emplois.py # + jobillico.py, espresso_jobs.py : portails
171 +│ └── <employeur>.py # 1 fichier = 1 employeur (sous-classe ~10 lignes)
172 +├── data/sources.json # registre descriptif des sources (221 entrées)
149 173 ├── frontend/ # React 18 + Vite + TS (carte MapLibre, sans jeton)
150 174 ├── tests/ # pytest : normalisation + rejeu des connecteurs
151 175 ├── scripts/check_headers.py # hook pre-commit : en-tête d'auteur obligatoire
152 −└── docs/ # audit Lou·Ka, déploiement
176 +├── scripts/gen_connector_docs.py # génère docs/connecteurs/ (fiches + INDEX)
177 +└── docs/ # connecteurs/, CONFORMITE.md, déploiement
153 178 ```
154 179
155 180 ## Démarrage rapide
@@ -194,6 +219,7 @@ En dev frontend : `npm run dev` dans `frontend/` (proxy `/api` → :8096).
194 219 | `SCRAPFLY_API_KEY` | rendu JS / anti-bot pour les pages carrières maison |
195 220 | `JOBKA_WORKDAY_DETAIL_LIMIT` | plafond de pages détail Workday par sync (défaut 300) |
196 221 | `JOBKA_SR_DETAIL_LIMIT` | plafond de pages détail SmartRecruiters (défaut 300) |
222 +| `JOBKA_<PLATEFORME>_*` | budgets par plateforme/portail (pages, détails, fenêtres) — défauts et rôle documentés dans [`docs/connecteurs/`](docs/connecteurs/INDEX.md) |
197 223
198 224 ## API
199 225
@@ -207,6 +233,7 @@ En dev frontend : `npm run dev` dans `frontend/` (proxy `/api` → :8096).
207 233 | `GET /api/sources` | registre des employeurs + fraîcheur par source |
208 234 | `GET /api/stats` | totaux, catégories, villes, dernières syncs |
209 235 | `POST /api/sync` | déclenche une synchronisation (webhook) |
236 +| `POST /api/employeurs/offres` | dépôt direct d'une offre par un employeur (modération manuelle) |
210 237
211 238 ## Ajouter un employeur (≈ 10 lignes)
212 239
modified data/sources.json +27 −1
@@ -3,7 +3,33 @@
3 3 "project": "Job·Ka — Groupe KA",
4 4 "author": "Simon-Pierre Boucher <contact@spboucher.ai>",
5 5 "role": "Registre descriptif des sources (alimente la page Sources)",
6 − "updated": "2026-08-18"
6 + "updated": "2026-08-18",
7 + "counts": {
8 + "employeurs_directs": 217,
9 + "plateformes_ats": 17,
10 + "portails": 3,
11 + "depot_direct": 1
12 + },
13 + "ats": [
14 + "adp",
15 + "ashby",
16 + "bamboohr",
17 + "breezy",
18 + "digitalrecruiters",
19 + "greenhouse",
20 + "icims",
21 + "lever",
22 + "njoyn",
23 + "recruitee",
24 + "smartrecruiters",
25 + "successfactors",
26 + "taleo",
27 + "ultipro",
28 + "workable",
29 + "workday",
30 + "workland"
31 + ],
32 + "docs": "docs/connecteurs/INDEX.md (fiches générées par scripts/gen_connector_docs.py) ; conformité : docs/CONFORMITE.md"
7 33 },
8 34 "sources": [
9 35 {
added docs/CONFORMITE.md +58 −0
@@ -0,0 +1,58 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/CONFORMITE.md
7 +Rôle : Registre de conformité des sources de données — base d'accès,
8 + attribution, lien de candidature, données personnelles
9 +Créé : 2026-08-18 Modifié : 2026-08-18
10 +=============================================================================
11 +-->
12 +
13 +# Job·Ka — Registre de conformité des sources
14 +
15 +> **Date de vérification : 2026-08-18** (vérifié dans le code, la base live et
16 +> le frontend). Détail par source : [`docs/connecteurs/INDEX.md`](connecteurs/INDEX.md).
17 +
18 +## Principes vérifiés (2026-08-18)
19 +
20 +- **L'app renvoie toujours vers l'offre originale.** Chaque offre conserve son
21 + URL source (`jobs.url`) ; le bouton « Postuler chez {employeur} » du
22 + frontend (`frontend/src/pages/Job.tsx`) ouvre `job.url` dans un nouvel
23 + onglet. Il n'existe **aucun formulaire de candidature** dans Job·Ka.
24 +- **Aucune donnée personnelle de candidat n'est collectée** : pas de CV, pas
25 + de profil candidat, pas de suivi de candidature. Le seul champ de contact
26 + stocké est le **courriel d'affaires** fourni volontairement par un employeur
27 + qui dépose une offre (`depot-direct`, `details.contact_email`).
28 +- **Identification honnête** : User-Agent
29 + `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les
30 + accès directs ; throttling par source (`request_delay`) et budgets de
31 + requêtes/pages détail par synchronisation ; cache BD des pages détail.
32 +- **Fidélité** : aucune valeur inventée (salaire, date, coordonnées) ; les
33 + offres retirées sont désactivées, jamais falsifiées.
34 +
35 +## Tableau par famille de sources
36 +
37 +| Famille | Sources | Base d'accès | Attribution / lien candidature | Données personnelles | Vérifié |
38 +|---|---|---|---|---|---|
39 +| **Employeurs directs — ATS** (workday, lever, greenhouse, smartrecruiters, bamboohr, breezy, recruitee, ashby, workable, taleo, njoyn, ultipro, icims, successfactors, adp, digitalrecruiters, workland) | 217 employeurs, 17 plateformes | **API JSON publique du tenant ATS** (ou HTML rendu serveur du babillard officiel) — le flux même que la page carrière de l'employeur utilise pour diffuser ses offres, sans authentification. Quelques domaines derrière anti-bot (ex. `*.njoyn.com`) lus via Scrapfly, sur pages strictement publiques. | Employeur affiché, badge « Offre directe », lien « Postuler » → page de l'offre **chez l'employeur** | Aucune | 2026-08-18 |
40 +| **Portail — Guichet-Emplois** (`guichet_emplois`) | 1 | Scraping de pages **publiques** (guichetemplois.gc.ca, gouv. du Canada), fenêtre bornée. `robots.txt` respecté : **Crawl-delay 5 s appliqué** (`request_delay = 5.0`). | Lien vers la fiche Guichet-Emplois, qui référence l'offre originale ; pas de badge « directe » ; masquée si l'offre directe existe (dédup direct-prioritaire) | Aucune | 2026-08-18 |
41 +| **Portail — Jobillico** (`jobillico`) | 1 | **Sitemaps publics** (`sitemap_job_postings_*.xml`) + **JSON-LD schema.org/JobPosting** publié par chaque page offre à destination des moteurs. robots.txt respecté, budgets par sync. | Lien vers l'offre originale sur Jobillico ; pas de badge « directe » ; dédup direct-prioritaire | Aucune | 2026-08-18 |
42 +| **Portail — Espresso-Jobs** (`espresso_jobs`) | 1 | Pages publiques + **JSON-LD schema.org** (ItemList + JobPosting). robots.txt respecté, budgets par sync. | Lien vers l'offre originale sur le portail ; pas de badge « directe » ; dédup direct-prioritaire | Aucune | 2026-08-18 |
43 +| **Dépôt direct employeurs** (`depot-direct`) | 1 canal | Soumission **volontaire** par l'employeur (`POST /api/employeurs/offres`), stockée inactive jusqu'à **modération manuelle** ; pot de miel anti-robots. | Lien fourni par l'employeur lui-même | Courriel d'affaires de contact seulement (fourni volontairement) | 2026-08-18 |
44 +
45 +## Sources écartées
46 +
47 +| Source | Raison |
48 +|---|---|
49 +| **Québec Emploi** (quebecemploi.gouv.qc.ca) | Accès derrière **authentification clicSÉQUR** — pas de flux public prévu pour la diffusion ; écarté (2026-08-18). |
50 +
51 +## Rappels d'exploitation
52 +
53 +- La déduplication inter-sources donne **toujours la canonique à l'offre
54 + directe** (`jobka/dedup.py`, `AGGREGATORS`) : la copie portail est masquée
55 + (`dup_of`), jamais supprimée.
56 +- Toute nouvelle source doit être ajoutée à ce registre **avec sa base
57 + d'accès et sa date de vérification**, et recevoir une fiche via
58 + `scripts/gen_connector_docs.py`.
added docs/connecteurs/INDEX.md +278 −0
@@ -0,0 +1,278 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/INDEX.md
7 +Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Job·Ka — Connecteurs (index)
14 +
15 +> Index généré le 2026-08-18 11:37 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`.
16 +
17 +**217 employeurs directs** connectés via **17 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **8519 offres actives** (7951 directes, 568 portails ; 16 masquées comme doublons inter-sources, soit 8503 visibles). 239 fiches.
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).
20 +
21 +## Plateformes ATS
22 +
23 +| Plateforme | Employeurs | Actives | Salaire | GPS |
24 +|---|---|---|---|---|
25 +| [`workday`](ats-workday.md) | 41 | 3552 | 26 % | 56 % |
26 +| [`successfactors`](ats-successfactors.md) | 3 | 1049 | 7 % | 85 % |
27 +| [`smartrecruiters`](ats-smartrecruiters.md) | 28 | 958 | 16 % | 100 % |
28 +| [`workable`](ats-workable.md) | 19 | 689 | 4 % | 100 % |
29 +| [`lever`](ats-lever.md) | 19 | 457 | 21 % | 96 % |
30 +| [`bamboohr`](ats-bamboohr.md) | 31 | 226 | 13 % | 96 % |
31 +| [`ashby`](ats-ashby.md) | 11 | 213 | 12 % | 75 % |
32 +| [`greenhouse`](ats-greenhouse.md) | 20 | 195 | 13 % | 99 % |
33 +| [`breezy`](ats-breezy.md) | 14 | 132 | 57 % | 97 % |
34 +| [`recruitee`](ats-recruitee.md) | 11 | 130 | 12 % | 98 % |
35 +| [`njoyn`](ats-njoyn.md) | 5 | 119 | 71 % | 42 % |
36 +| [`taleo`](ats-taleo.md) | 4 | 68 | 0 % | 100 % |
37 +| [`icims`](ats-icims.md) | 5 | 57 | 25 % | 95 % |
38 +| [`digitalrecruiters`](ats-digitalrecruiters.md) | 1 | 49 | 98 % | 61 % |
39 +| [`workland`](ats-workland.md) | 1 | 23 | 0 % | 0 % |
40 +| [`ultipro`](ats-ultipro.md) | 1 | 22 | 91 % | 100 % |
41 +| [`adp`](ats-adp.md) | 3 | 12 | 75 % | 100 % |
42 +
43 +## Portails agrégateurs & dépôt
44 +
45 +| Source | Actives | Salaire | Dernier sync |
46 +|---|---|---|---|
47 +| [Guichet-Emplois (Canada)](guichet_emplois.md) | 25 | 100 % | 2026-08-18 11:25 |
48 +| [Jobillico](jobillico.md) | 249 | 49 % | 2026-08-18 11:26 |
49 +| [Espresso-Jobs](espresso_jobs.md) | 294 | 22 % | 2026-08-18 11:24 |
50 +| [Dépôt direct employeurs](depot-direct.md) | 0 (0 en modération) | — | au fil de l'eau |
51 +
52 +## Employeurs directs (par volume d'offres actives)
53 +
54 +| Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK |
55 +|---|---|---|---|---|---|
56 +| [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 1005 | 45 % | 63 % | ✅ |
57 +| [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 972 | 0 % | 0 % | ✅ |
58 +| [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 843 | 0 % | 82 % | ✅ |
59 +| [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 389 | 0 % | 100 % | ✅ |
60 +| [Go RH](gorh.md) | [`lever`](ats-lever.md) | 266 | 18 % | 97 % | ✅ |
61 +| [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 245 | 0 % | 94 % | ✅ |
62 +| [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 221 | 0 % | 100 % | ✅ |
63 +| [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 180 | 18 % | 96 % | ✅ |
64 +| [Reitmans](reitmanscanadalteltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 142 | 22 % | 100 % | ✅ |
65 +| [Ubisoft](ubisoft.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 125 | 0 % | 100 % | ✅ |
66 +| [BMO Groupe financier](bmo.md) | [`workday`](ats-workday.md) | 107 | 84 % | 79 % | ✅ |
67 +| [Domtar](domtar.md) | [`successfactors`](ats-successfactors.md) | 107 | 0 % | 99 % | ✅ |
68 +| [Cascades](cascades.md) | [`successfactors`](ats-successfactors.md) | 99 | 75 % | 99 % | ✅ |
69 +| [Genetec](genetec_inc.md) | [`workable`](ats-workable.md) | 79 | 0 % | 100 % | ✅ |
70 +| [MaintainX](maintainx.md) | [`ashby`](ats-ashby.md) | 78 | 6 % | 83 % | ✅ |
71 +| [Vidéotron](videotron.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 78 | 35 % | 100 % | ✅ |
72 +| [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 76 | 97 % | 100 % | ✅ |
73 +| [Agropur](agropur.md) | [`workday`](ats-workday.md) | 75 | 91 % | 99 % | ✅ |
74 +| [Airbus Canada](airbus.md) | [`workday`](ats-workday.md) | 73 | 1 % | 100 % | ✅ |
75 +| [Autodesk](autodesk.md) | [`workday`](ats-workday.md) | 67 | 91 % | 48 % | ✅ |
76 +| [EMCO](emcocorporation.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 67 | 30 % | 100 % | ✅ |
77 +| [Groupe Canam](groupecanam.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 67 | 63 % | 99 % | ✅ |
78 +| [Banque CIBC](cibc.md) | [`workday`](ats-workday.md) | 63 | 2 % | 100 % | ✅ |
79 +| [ANCIA Personnel](anciapersonnelinc.md) | [`recruitee`](ats-recruitee.md) | 59 | 10 % | 100 % | ✅ |
80 +| [Lightspeed Commerce](lightspeedhq.md) | [`ashby`](ats-ashby.md) | 56 | 7 % | 98 % | ✅ |
81 +| [CAE](cae.md) | [`workday`](ats-workday.md) | 52 | 8 % | 92 % | ✅ |
82 +| [Manuvie](manulife.md) | [`workday`](ats-workday.md) | 51 | 90 % | 71 % | ✅ |
83 +| [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 50 | 98 % | 100 % | ✅ |
84 +| [Santé Québec](sante_quebec.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 49 | 98 % | 61 % | ✅ |
85 +| [Beneva](beneva.md) | [`workday`](ats-workday.md) | 48 | 2 % | 100 % | ✅ |
86 +| [Cogeco](cogeco.md) | [`workday`](ats-workday.md) | 48 | 17 % | 56 % | ✅ |
87 +| [Cohere](cohere.md) | [`ashby`](ats-ashby.md) | 46 | 17 % | 37 % | ✅ |
88 +| [Investissements PSP](investpsp.md) | [`workday`](ats-workday.md) | 44 | 2 % | 100 % | ✅ |
89 +| [McKesson Canada](mckesson.md) | [`workday`](ats-workday.md) | 43 | 81 % | 86 % | ✅ |
90 +| [SOGECLAIR](sogeclair.md) | [`workable`](ats-workable.md) | 43 | 2 % | 100 % | ✅ |
91 +| [Levio](levio.md) | [`greenhouse`](ats-greenhouse.md) | 42 | 0 % | 100 % | ✅ |
92 +| [Techo-Bloc](techo_bloc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 40 | 40 % | 100 % | ✅ |
93 +| [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 39 | 3 % | 100 % | ✅ |
94 +| [Transat A.T.](transatat1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 39 | 5 % | 97 % | ✅ |
95 +| [Promutuel Assurance](promutuel.md) | [`workday`](ats-workday.md) | 37 | 0 % | 100 % | ✅ |
96 +| [QSL](qsl.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 37 | 38 % | 100 % | ✅ |
97 +| [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 37 | 11 % | 100 % | ✅ |
98 +| [Side (PTW)](sideinc.md) | [`workable`](ats-workable.md) | 32 | 0 % | 100 % | ✅ |
99 +| [Service alimentaire Gordon](gfs.md) | [`workday`](ats-workday.md) | 31 | 55 % | 0 % | ✅ |
100 +| [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 29 | 0 % | 100 % | ✅ |
101 +| [Brand Momentum](brandmomentum.md) | [`breezy`](ats-breezy.md) | 27 | 67 % | 100 % | ✅ |
102 +| [CDPQ — Caisse de dépôt et placement du Québec](cdpq.md) | [`workday`](ats-workday.md) | 27 | 0 % | 100 % | ✅ |
103 +| [EXFO](exfo.md) | [`workday`](ats-workday.md) | 27 | 0 % | 100 % | ✅ |
104 +| [Scotts Canada (Fafard)](scottsmiraclegro.md) | [`workday`](ats-workday.md) | 27 | 4 % | 0 % | ✅ |
105 +| [Tecsys](tecsys.md) | [`workable`](ats-workable.md) | 27 | 0 % | 100 % | ✅ |
106 +| [Saputo](saputo.md) | [`workday`](ats-workday.md) | 25 | 80 % | 100 % | ✅ |
107 +| [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 23 | 26 % | 100 % | ✅ |
108 +| [Broccolini](broccolini.md) | [`bamboohr`](ats-bamboohr.md) | 23 | 0 % | 100 % | ✅ |
109 +| [Centre de services scolaire de Montréal](cssdm.md) | [`workland`](ats-workland.md) | 23 | 0 % | 0 % | ✅ |
110 +| [CIUSSS de l'Est-de-l'Île-de-Montréal](ciusss_est_montreal.md) | [`taleo`](ats-taleo.md) | 23 | 0 % | 100 % | ✅ |
111 +| [Intact Corporation financière](intactfc.md) | [`workday`](ats-workday.md) | 23 | 0 % | 100 % | ✅ |
112 +| [MEDFAR Solutions Cliniques](medfar.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ |
113 +| [Rio Tinto](riotinto.md) | [`workday`](ats-workday.md) | 23 | 0 % | 100 % | ✅ |
114 +| [Cirque du Soleil](cirquedusoleil.md) | [`lever`](ats-lever.md) | 22 | 0 % | 86 % | ✅ |
115 +| [McCarthy Tétrault](mccarthy_tetrault.md) | [`icims`](ats-icims.md) | 22 | 0 % | 100 % | ✅ |
116 +| [Messer Canada](messer_canada.md) | [`ultipro`](ats-ultipro.md) | 22 | 91 % | 100 % | ✅ |
117 +| [mthree](mthreerecruitingportal.md) | [`greenhouse`](ats-greenhouse.md) | 22 | 0 % | 95 % | ✅ |
118 +| [Xsolla](xsolla.md) | [`lever`](ats-lever.md) | 21 | 95 % | 95 % | ✅ |
119 +| [dcbel](dcbel.md) | [`bamboohr`](ats-bamboohr.md) | 20 | 0 % | 100 % | ✅ |
120 +| [Rodeo FX](rodeofx.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 20 | 0 % | 100 % | ✅ |
121 +| [Vosker](vosker.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 20 | 0 % | 100 % | ✅ |
122 +| [CAA-Québec](caaquebec.md) | [`workday`](ats-workday.md) | 19 | 16 % | 100 % | ✅ |
123 +| [Réseau de transport de la Capitale](rtc_quebec.md) | [`njoyn`](ats-njoyn.md) | 19 | 0 % | 0 % | ✅ |
124 +| [Agnico Eagle Mines](agnico_eagle.md) | [`taleo`](ats-taleo.md) | 18 | 0 % | 100 % | ✅ |
125 +| [Explorance](explorance.md) | [`bamboohr`](ats-bamboohr.md) | 18 | 0 % | 100 % | ✅ |
126 +| [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 18 | 11 % | 100 % | ✅ |
127 +| [OSEDEA](osedea.md) | [`lever`](ats-lever.md) | 18 | 0 % | 100 % | ✅ |
128 +| [Ville de Gatineau](ville_gatineau.md) | [`njoyn`](ats-njoyn.md) | 18 | 94 % | 0 % | ✅ |
129 +| [Vooban](vooban.md) | [`greenhouse`](ats-greenhouse.md) | 18 | 0 % | 100 % | ✅ |
130 +| [NOVIPRO](novipro.md) | [`breezy`](ats-breezy.md) | 17 | 0 % | 100 % | ✅ |
131 +| [Produits Labelink](labelink.md) | [`bamboohr`](ats-bamboohr.md) | 17 | 0 % | 100 % | ✅ |
132 +| [VO2 Group](vo2_group.md) | [`lever`](ats-lever.md) | 17 | 6 % | 100 % | ✅ |
133 +| [Alcoa Canada](alcoa.md) | [`workday`](ats-workday.md) | 16 | 12 % | 44 % | ✅ |
134 +| [BDC](bdc.md) | [`workday`](ats-workday.md) | 16 | 0 % | 100 % | ✅ |
135 +| [iA Groupe financier](ia_groupe.md) | [`workday`](ats-workday.md) | 16 | 6 % | 100 % | ✅ |
136 +| [Société de transport de Laval](stl_laval.md) | [`njoyn`](ats-njoyn.md) | 16 | 25 % | 0 % | ✅ |
137 +| [Spiria](spiria.md) | [`lever`](ats-lever.md) | 16 | 69 % | 100 % | ✅ |
138 +| [Valtech](valtech.md) | [`greenhouse`](ats-greenhouse.md) | 16 | 12 % | 100 % | ✅ |
139 +| [Ville de Terrebonne](ville_terrebonne.md) | [`njoyn`](ats-njoyn.md) | 16 | 88 % | 0 % | ✅ |
140 +| [Bell Textron Canada](bell_textron.md) | [`taleo`](ats-taleo.md) | 15 | 0 % | 100 % | ✅ |
141 +| [Gameloft](gameloft.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 15 | 0 % | 100 % | ✅ |
142 +| [Réseau Mieux-Être](reseau_mieux_etre.md) | [`breezy`](ats-breezy.md) | 15 | 0 % | 100 % | ✅ |
143 +| [Sid Lee](sidlee.md) | [`greenhouse`](ats-greenhouse.md) | 15 | 0 % | 100 % | ✅ |
144 +| [Evolving Web](evolving_web.md) | [`workable`](ats-workable.md) | 14 | 0 % | 100 % | ✅ |
145 +| [LG2](lg2.md) | [`recruitee`](ats-recruitee.md) | 14 | 7 % | 100 % | ✅ |
146 +| [OPAL-RT Technologies](opalrt.md) | [`bamboohr`](ats-bamboohr.md) | 14 | 0 % | 100 % | ✅ |
147 +| [Investissement Québec](investquebec.md) | [`workday`](ats-workday.md) | 13 | 8 % | 100 % | ✅ |
148 +| [Logisco](logisco.md) | [`bamboohr`](ats-bamboohr.md) | 13 | 38 % | 100 % | ✅ |
149 +| [MicroHabitat](microhabitat.md) | [`breezy`](ats-breezy.md) | 13 | 100 % | 100 % | ✅ |
150 +| [Talan](talan.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 13 | 0 % | 100 % | ✅ |
151 +| [Victoria Park Medispa](vicpark.md) | [`bamboohr`](ats-bamboohr.md) | 13 | 0 % | 92 % | ✅ |
152 +| [Bayshore HealthCare](bayshore.md) | [`taleo`](ats-taleo.md) | 12 | 0 % | 100 % | ✅ |
153 +| [GSK](gsk.md) | [`workday`](ats-workday.md) | 12 | 0 % | 83 % | ✅ |
154 +| [3 Brasseurs Canada](trois_brasseurs.md) | [`breezy`](ats-breezy.md) | 11 | 73 % | 100 % | ✅ |
155 +| [KPI Digital](kpidigital.md) | [`bamboohr`](ats-bamboohr.md) | 11 | 0 % | 100 % | ✅ |
156 +| [Mirego](mirego.md) | [`lever`](ats-lever.md) | 11 | 0 % | 100 % | ✅ |
157 +| [TSMG](tsmg.md) | [`lever`](ats-lever.md) | 11 | 0 % | 100 % | ✅ |
158 +| [AlayaCare](alayacare.md) | [`greenhouse`](ats-greenhouse.md) | 10 | 0 % | 100 % | ✅ |
159 +| [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 10 | 0 % | 100 % | ✅ |
160 +| [EQ3](eq3_ltd.md) | [`breezy`](ats-breezy.md) | 10 | 60 % | 100 % | ✅ |
161 +| [Fonds de solidarité FTQ](fondsftq.md) | [`workday`](ats-workday.md) | 10 | 0 % | 100 % | ✅ |
162 +| [JG Rive-Sud (GFS)](jgrivesud.md) | [`workday`](ats-workday.md) | 10 | 70 % | 0 % | ✅ |
163 +| [Lamour](lamour.md) | [`workable`](ats-workable.md) | 10 | 0 % | 100 % | ✅ |
164 +| [ADI - Albert Davidson Industries](adi_albert_davidson_industries.md) | [`breezy`](ats-breezy.md) | 9 | 100 % | 100 % | ✅ |
165 +| [Canadian Tire](canadiantirecorporation.md) | [`workday`](ats-workday.md) | 9 | 56 % | 100 % | ✅ |
166 +| [EDF Renouvelables Canada](edf_renouvelables.md) | [`icims`](ats-icims.md) | 9 | 67 % | 67 % | ✅ |
167 +| [Eminent Valet](eminent_valet.md) | [`workable`](ats-workable.md) | 9 | 100 % | 100 % | ✅ |
168 +| [Framestore](framestore.md) | [`recruitee`](ats-recruitee.md) | 9 | 0 % | 100 % | ✅ |
169 +| [J'Excelle](jexcelleinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 9 | 0 % | 100 % | ✅ |
170 +| [Nora Pharma](nora_pharma.md) | [`breezy`](ats-breezy.md) | 9 | 100 % | 89 % | ✅ |
171 +| [SIA Innovations](siainnovationsinc.md) | [`greenhouse`](ats-greenhouse.md) | 9 | 56 % | 100 % | ✅ |
172 +| [Sun Life](sunlife.md) | [`workday`](ats-workday.md) | 9 | 0 % | 100 % | ✅ |
173 +| [Tetrix](tetrix.md) | [`ashby`](ats-ashby.md) | 9 | 100 % | 11 % | ✅ |
174 +| [Big Bang](bigbang.md) | [`bamboohr`](ats-bamboohr.md) | 8 | 25 % | 100 % | ✅ |
175 +| [Botpress](botpress.md) | [`workable`](ats-workable.md) | 8 | 0 % | 100 % | ✅ |
176 +| [CF Montréal](cfmontreal.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 8 | 0 % | 100 % | ✅ |
177 +| [GURUS Solutions](gurussolutions.md) | [`greenhouse`](ats-greenhouse.md) | 8 | 0 % | 100 % | ✅ |
178 +| [LIDD Consultants](lidd.md) | [`workable`](ats-workable.md) | 8 | 0 % | 100 % | ✅ |
179 +| [Mila — Institut québécois d'IA](mila_2.md) | [`workable`](ats-workable.md) | 8 | 0 % | 100 % | ✅ |
180 +| [Nuovo Photography](nuovophotography.md) | [`workable`](ats-workable.md) | 8 | 12 % | 100 % | ✅ |
181 +| [Omni Hôtel Mont-Royal](omni_hotels_horaire.md) | [`icims`](ats-icims.md) | 8 | 50 % | 100 % | ✅ |
182 +| [Omni Hôtel Mont-Royal](omni_hotels_gestion.md) | [`icims`](ats-icims.md) | 8 | 50 % | 100 % | ✅ |
183 +| [People Can Fly](peoplecanfly.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 8 | 0 % | 100 % | ✅ |
184 +| [AJ Walter Aviation](ajwalter.md) | [`recruitee`](ats-recruitee.md) | 7 | 0 % | 100 % | ✅ |
185 +| [Devimco Appartements](devimco.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 14 % | 100 % | ✅ |
186 +| [Luqia (INO)](ino_ca.md) | [`breezy`](ats-breezy.md) | 7 | 0 % | 100 % | ✅ |
187 +| [Petal](petalmd.md) | [`recruitee`](ats-recruitee.md) | 7 | 14 % | 100 % | ✅ |
188 +| [Robotiq](robotiq.md) | [`bamboohr`](ats-bamboohr.md) | 7 | 0 % | 100 % | ✅ |
189 +| [Church & Dwight Canada](churchdwight.md) | [`workday`](ats-workday.md) | 6 | 0 % | 100 % | ✅ |
190 +| [EQ Bank](eqbank.md) | [`lever`](ats-lever.md) | 6 | 17 % | 50 % | ✅ |
191 +| [Hopper](hopper.md) | [`ashby`](ats-ashby.md) | 6 | 0 % | 67 % | ✅ |
192 +| [Mattel (Mega Bloks)](mattelinc.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 6 | 0 % | 100 % | ✅ |
193 +| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | [`adp`](ats-adp.md) | 6 | 50 % | 100 % | ✅ |
194 +| [MSI Gestion immobilière](msi_gestion.md) | [`adp`](ats-adp.md) | 6 | 100 % | 100 % | ✅ |
195 +| [MXO](mxo.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 100 % | 0 % | ✅ |
196 +| [Nexapp](nexapp.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
197 +| [North West Rubber](northwestrubber.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 0 % | 100 % | ✅ |
198 +| [Portage CyberTech](portagecybertech.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 17 % | 100 % | ✅ |
199 +| [Sweat Pants Agency](sweat_pants_agency.md) | [`workable`](ats-workable.md) | 6 | 100 % | 100 % | ✅ |
200 +| [Triotech](triotech.md) | [`bamboohr`](ats-bamboohr.md) | 6 | 17 % | 100 % | ✅ |
201 +| [US Mobile](usmobile.md) | [`lever`](ats-lever.md) | 6 | 100 % | 100 % | ✅ |
202 +| [Adèle Express](adeleexpressfr.md) | [`recruitee`](ats-recruitee.md) | 5 | 60 % | 100 % | ✅ |
203 +| [Alphanumeric Systems](alphanumeric_systems.md) | [`breezy`](ats-breezy.md) | 5 | 100 % | 100 % | ✅ |
204 +| [Astucemedia](astucemedia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 5 | 0 % | 100 % | ✅ |
205 +| [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ |
206 +| [Distro](distro.md) | [`lever`](ats-lever.md) | 5 | 100 % | 100 % | ✅ |
207 +| [Lush Cosmétiques](lush.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 100 % | 100 % | ✅ |
208 +| [Mistral AI](mistral_ai.md) | [`ashby`](ats-ashby.md) | 5 | 0 % | 100 % | ✅ |
209 +| [Médialo](medialo.md) | [`recruitee`](ats-recruitee.md) | 5 | 0 % | 80 % | ✅ |
210 +| [Poka](poka.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 0 % | 100 % | ✅ |
211 +| [Propriétés Scalia](scalia.md) | [`bamboohr`](ats-bamboohr.md) | 5 | 0 % | 100 % | ✅ |
212 +| [Raymond Chabot Grant Thornton](rcgt.md) | [`workday`](ats-workday.md) | 5 | 0 % | 100 % | ✅ |
213 +| [Surmesur](surmesur.md) | [`bamboohr`](ats-bamboohr.md) | 5 | 80 % | 100 % | ✅ |
214 +| [TandemLaunch](tandemlaunch.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 40 % | 100 % | ✅ |
215 +| [Toon Boom Animation](toonboom.md) | [`bamboohr`](ats-bamboohr.md) | 5 | 0 % | 100 % | ✅ |
216 +| [VOXDATA](voxdata.md) | [`breezy`](ats-breezy.md) | 5 | 100 % | 80 % | ✅ |
217 +| [Broadsign](broadsign.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 0 % | 100 % | ✅ |
218 +| [EOS Aircraft](eosaircraftinc.md) | [`bamboohr`](ats-bamboohr.md) | 4 | 0 % | 100 % | ✅ |
219 +| [HoYoverse](hoyoverse.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
220 +| [Korem](korem.md) | [`bamboohr`](ats-bamboohr.md) | 4 | 0 % | 100 % | ✅ |
221 +| [Mitacs](mitacs.md) | [`bamboohr`](ats-bamboohr.md) | 4 | 100 % | 100 % | ✅ |
222 +| [Nomic Bio](nomic.md) | [`ashby`](ats-ashby.md) | 4 | 0 % | 75 % | ✅ |
223 +| [Pfizer Canada](pfizer.md) | [`workday`](ats-workday.md) | 4 | 100 % | 0 % | ✅ |
224 +| [Plusgrade](plusgrade.md) | [`workday`](ats-workday.md) | 4 | 0 % | 100 % | ✅ |
225 +| [Vaco](vaco.md) | [`greenhouse`](ats-greenhouse.md) | 4 | 75 % | 100 % | ✅ |
226 +| [Bardel Entertainment](bardel_entertainment.md) | [`workable`](ats-workable.md) | 3 | 33 % | 100 % | ✅ |
227 +| [Brasseries Sleeman (Unibroue)](sleeman.md) | [`workday`](ats-workday.md) | 3 | 33 % | 0 % | ✅ |
228 +| [DiliTrust](dilitrust.md) | [`lever`](ats-lever.md) | 3 | 0 % | 100 % | ✅ |
229 +| [Flinks](flinks.md) | [`workable`](ats-workable.md) | 3 | 100 % | 100 % | ✅ |
230 +| [Fuse Energy](fuse.md) | [`ashby`](ats-ashby.md) | 3 | 0 % | 100 % | ✅ |
231 +| [Gearbox Studio Québec](gearboxquebec.md) | [`greenhouse`](ats-greenhouse.md) | 3 | 0 % | 100 % | ✅ |
232 +| [Mistplay](mistplay.md) | [`lever`](ats-lever.md) | 3 | 33 % | 100 % | ✅ |
233 +| [No Saint](no_saint.md) | [`ashby`](ats-ashby.md) | 3 | 0 % | 100 % | ✅ |
234 +| [Rethink](rethinkcanada.md) | [`bamboohr`](ats-bamboohr.md) | 3 | 0 % | 100 % | ✅ |
235 +| [Squeeze Studio Animation](squeezestudio.md) | [`recruitee`](ats-recruitee.md) | 3 | 0 % | 67 % | ✅ |
236 +| [Unit8](unit8.md) | [`workable`](ats-workable.md) | 3 | 0 % | 100 % | ✅ |
237 +| [Alimentiv](alimentiv_2.md) | [`lever`](ats-lever.md) | 2 | 100 % | 50 % | ✅ |
238 +| [Aliments Ouimet-Cordon Bleu inc.](cordonbleu.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 50 % | 100 % | ✅ |
239 +| [BIXI Montréal](biximontreal.md) | [`recruitee`](ats-recruitee.md) | 2 | 100 % | 100 % | ✅ |
240 +| [Dulcedo Management](dulcedo.md) | [`lever`](ats-lever.md) | 2 | 50 % | 50 % | ✅ |
241 +| [EVLO (Hydro-Québec)](evlo.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ |
242 +| [Fenêtres Concept](fenetresconcept.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 100 % | 100 % | ✅ |
243 +| [Flare (cybersécurité)](flare.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 50 % | 100 % | ✅ |
244 +| [Groupe BC2](bc2.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ |
245 +| [On Running](onrunning.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 0 % | 100 % | ✅ |
246 +| [OTT Financial](ott.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 0 % | 100 % | ✅ |
247 +| [Playmind](playmind.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 0 % | 100 % | ✅ |
248 +| [Potloc](potloc.md) | [`lever`](ats-lever.md) | 2 | 0 % | 100 % | ✅ |
249 +| [ServiceNow](servicenow.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 0 % | 100 % | ✅ |
250 +| [Spreedly](spreedly.md) | [`lever`](ats-lever.md) | 2 | 0 % | 100 % | ✅ |
251 +| [Suncor Énergie](suncor.md) | [`workday`](ats-workday.md) | 2 | 0 % | 100 % | ✅ |
252 +| [Vaporus](vaporus_inc.md) | [`breezy`](ats-breezy.md) | 2 | 100 % | 50 % | ✅ |
253 +| [Vasco](vasco.md) | [`ashby`](ats-ashby.md) | 2 | 0 % | 100 % | ✅ |
254 +| [Venture Media](venturemedia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 2 | 50 % | 100 % | ✅ |
255 +| [VML Canada](vmlcanadaen.md) | [`greenhouse`](ats-greenhouse.md) | 2 | 50 % | 100 % | ✅ |
256 +| [Ziptrek Tremblant](ziptrekeco.md) | [`bamboohr`](ats-bamboohr.md) | 2 | 100 % | 0 % | ✅ |
257 +| [Amilia](amilia.md) | [`recruitee`](ats-recruitee.md) | 1 | 0 % | 0 % | ✅ |
258 +| [Atecna](atecna_montreal.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ |
259 +| [Canada Global Recruitment](canada_global.md) | [`breezy`](ats-breezy.md) | 1 | 0 % | 0 % | ✅ |
260 +| [Charger Logistics](charger_logistics_inc.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ |
261 +| [GoLogic](gologic.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
262 +| [Industrious](industrious.md) | [`ashby`](ats-ashby.md) | 1 | 0 % | 100 % | ✅ |
263 +| [NATIONAL](national.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 0 % | 100 % | ✅ |
264 +| [Poulet Rouge](pouletrouge.md) | [`bamboohr`](ats-bamboohr.md) | 1 | 0 % | 0 % | ✅ |
265 +| [Samsara](samsara.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 100 % | 100 % | ✅ |
266 +| [Sparkgrid](sparkgrid.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
267 +| [Stelpro](stelpro.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
268 +| [Talsom](talsom.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
269 +| [Xplornet](xplornet.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
270 +| [YouSet](youset.md) | [`breezy`](ats-breezy.md) | 1 | 0 % | 100 % | ✅ |
271 +| [Industries Lassonde](lassonde.md) | [`adp`](ats-adp.md) | 0 | — | — | ✅ |
272 +| [TTC Global](ttcglobal.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
273 +
274 +## Régénérer cette documentation
275 +
276 +```bash
277 +cd ~/apps/job-ka && .venv/bin/python scripts/gen_connector_docs.py
278 +```
added docs/connecteurs/adeleexpressfr.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/adeleexpressfr.md
7 +Rôle : Fiche connecteur — Adèle Express (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Adèle Express (`adeleexpressfr`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/adeleexpressfr.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Adèle Express]()
20 +- **Page carrières** : https://adeleexpressfr.recruitee.com
21 +- **Secteurs** : Transport
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Adèle Express` |
33 +| `ORG` | `adeleexpressfr` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 60 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 0 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Professionnel de ménage - Pour entretien ménager à domicile - Offre / Juin 2026* — Montréal · ∅ · parue le 2026-06-23.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 3/5 actives (60 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 5/5 actives (100 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:12 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync adeleexpressfr` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='adeleexpressfr' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Adèle Express » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/adeleexpressfr.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/adi_albert_davidson_industries.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/adi_albert_davidson_industries.md
7 +Rôle : Fiche connecteur — ADI - Albert Davidson Industries (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# ADI - Albert Davidson Industries (`adi_albert_davidson_industries`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/adi_albert_davidson_industries.py`
16 +
17 +## Description
18 +
19 +- **Site** : [ADI - Albert Davidson Industries]()
20 +- **Page carrières** : https://adi-albert-davidson-industries.breezy.hr
21 +- **Secteurs** : Manufacture
22 +- **Région** : Pointe-Claire
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `ADI - Albert Davidson Industries` |
33 +| `ORG` | `adi-albert-davidson-industries` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 11 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Assistant Production Director* — Pointe-Claire · $28 – $34 / hour · parue le 2026-06-08.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 9/9 actives (100 %)
76 +- **GPS** : 9/9 actives (100 %)
77 +- **Mode** : 1/9 actives (11 %)
78 +- **Parution** : 9/9 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:12 — trouvées 9, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync adi_albert_davidson_industries` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='adi_albert_davidson_industries' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez ADI - Albert Davidson Industries » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/adi_albert_davidson_industries.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/agnico_eagle.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/agnico_eagle.md
7 +Rôle : Fiche connecteur — Agnico Eagle Mines (employeur direct, ATS taleo)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Agnico Eagle Mines (`agnico_eagle`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`taleo`](ats-taleo.md) · Statut registre : actif · Connecteur : `jobka/connectors/agnico_eagle.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Agnico Eagle Mines](https://www.agnicoeagle.com)
20 +- **Page carrières** : https://agnicoeagle.taleo.net/careersection/2/jobsearch.ftl?lang=fr
21 +- **Secteurs** : Mines, Ingénierie, Métiers spécialisés
22 +- **Région** : Abitibi-Témiscamingue, Malartic, Rouyn-Noranda
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-taleo.md`](ats-taleo.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Agnico Eagle Mines` |
33 +| `HOST` | `agnicoeagle` |
34 +| `LANG` | `fr` |
35 +| `SECTION` | `2` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **18 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 6 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 94 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Coordonnateur ressources humaines – processus et projets* — Québec · ∅ · parue le 2026-08-31.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_TALEO_DETAIL_LIMIT` | `120` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 18 (dont **18 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/18 actives (0 %)
83 +- **GPS** : 18/18 actives (100 %)
84 +- **Mode** : 0/18 actives (0 %)
85 +- **Parution** : 17/18 actives (94 %)
86 +- **Dernier sync** : 2026-08-18 11:12 — trouvées 18, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync agnico_eagle` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='agnico_eagle' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Agnico Eagle Mines » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/agnico_eagle.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/agropur.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/agropur.md
7 +Rôle : Fiche connecteur — Agropur (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Agropur (`agropur`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/agropur.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Agropur](https://www.agropur.com)
20 +- **Page carrières** : https://agropur.wd3.myworkdayjobs.com/Agropur_Careers
21 +- **Secteurs** : Agroalimentaire, Production
22 +- **Région** : Longueuil / province
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Agropur` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Agropur_Careers` |
35 +| `TENANT` | `agropur` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **75 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 99 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 91 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 91 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 57 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 99 % |
63 +
64 +Exemple réel : *Analyste Inventaire* — Québec · Salary range 004: 73 000$ à 91 200$ (Salary will be determined based on ski · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 75 (dont **75 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 68/75 actives (91 %)
83 +- **GPS** : 74/75 actives (99 %)
84 +- **Mode** : 0/75 actives (0 %)
85 +- **Parution** : 75/75 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:12 — trouvées 75, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync agropur` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='agropur' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Agropur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/agropur.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/airbus.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/airbus.md
7 +Rôle : Fiche connecteur — Airbus Canada (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Airbus Canada (`airbus`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/airbus.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Airbus Canada](https://airbus.com)
20 +- **Page carrières** : https://ag.wd3.myworkdayjobs.com/Airbus
21 +- **Secteurs** : n/d
22 +- **Région** : Mirabel
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Airbus Canada` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Airbus` |
35 +| `TENANT` | `ag` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **73 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 1 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 1 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 84 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Conseiller.ère recrutement/Recruitment Advisor* — Montréal · Salaire : 82 000$ · parue le 2026-08-12.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 73 (dont **73 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/73 actives (1 %)
83 +- **GPS** : 73/73 actives (100 %)
84 +- **Mode** : 0/73 actives (0 %)
85 +- **Parution** : 73/73 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 73, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync airbus` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='airbus' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Airbus Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/airbus.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/ajwalter.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ajwalter.md
7 +Rôle : Fiche connecteur — AJ Walter Aviation (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# AJ Walter Aviation (`ajwalter`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/ajwalter.py`
16 +
17 +## Description
18 +
19 +- **Site** : [AJ Walter Aviation]()
20 +- **Page carrières** : https://ajwalter.recruitee.com
21 +- **Secteurs** : Aéronautique
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `AJ Walter Aviation` |
33 +| `ORG` | `ajwalter` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **7 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 43 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Analyste, Soutien à la production - Production Support Analyst* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 7 (dont **7 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/7 actives (0 %)
76 +- **GPS** : 7/7 actives (100 %)
77 +- **Mode** : 7/7 actives (100 %)
78 +- **Parution** : 7/7 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 7, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync ajwalter` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ajwalter' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez AJ Walter Aviation » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/ajwalter.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/alayacare.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/alayacare.md
7 +Rôle : Fiche connecteur — AlayaCare (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# AlayaCare (`alayacare`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/alayacare.py`
16 +
17 +## Description
18 +
19 +- **Site** : [AlayaCare](https://www.alayacare.com)
20 +- **Page carrières** : https://job-boards.greenhouse.io/alayacare
21 +- **Secteurs** : TI, Santé
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `alayacare` |
33 +| `EMPLOYER` | `AlayaCare` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 10 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Manager, Software Development* — Montréal · ∅ · parue le 2026-08-11.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/10 actives (0 %)
76 +- **GPS** : 10/10 actives (100 %)
77 +- **Mode** : 0/10 actives (0 %)
78 +- **Parution** : 10/10 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 10, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync alayacare` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='alayacare' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez AlayaCare » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/alayacare.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/alcoa.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/alcoa.md
7 +Rôle : Fiche connecteur — Alcoa Canada (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Alcoa Canada (`alcoa`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/alcoa.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Alcoa Canada](https://alcoa.com)
20 +- **Page carrières** : https://alcoa.wd5.myworkdayjobs.com/Careers
21 +- **Secteurs** : n/d
22 +- **Région** : Baie-Comeau
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Alcoa Canada` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `Careers` |
35 +| `TENANT` | `alcoa` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **16 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 56 % |
50 +| `region` — Région | région administrative | 94 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 12 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 12 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 88 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 44 % |
63 +
64 +Exemple réel : *Assistant(e) opérateur ou opératrice* — Baie-Comeau · Salaire horaire au-delà de 45 $ l'heure · parue le 2026-08-05.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 16 (dont **16 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 2/16 actives (12 %)
83 +- **GPS** : 7/16 actives (44 %)
84 +- **Mode** : 0/16 actives (0 %)
85 +- **Parution** : 16/16 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 16, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync alcoa` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='alcoa' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Alcoa Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/alcoa.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/alimentiv_2.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/alimentiv_2.md
7 +Rôle : Fiche connecteur — Alimentiv (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Alimentiv (`alimentiv_2`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/alimentiv_2.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Alimentiv]()
20 +- **Page carrières** : https://jobs.lever.co/alimentiv-2
21 +- **Secteurs** : Recherche clinique
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Alimentiv` |
33 +| `ORG` | `alimentiv-2` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 0 % |
48 +| `region` — Région | région administrative | 0 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 50 % |
61 +
62 +Exemple réel : *Statistician* — ∅ · ∅ · parue le 2026-07-28.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 2/2 actives (100 %)
76 +- **GPS** : 1/2 actives (50 %)
77 +- **Mode** : 2/2 actives (100 %)
78 +- **Parution** : 2/2 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 2, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync alimentiv_2` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='alimentiv_2' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Alimentiv » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/alimentiv_2.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/alphanumeric_systems.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/alphanumeric_systems.md
7 +Rôle : Fiche connecteur — Alphanumeric Systems (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Alphanumeric Systems (`alphanumeric_systems`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/alphanumeric_systems.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Alphanumeric Systems]()
20 +- **Page carrières** : https://alphanumeric-systems.breezy.hr
21 +- **Secteurs** : TI, Santé
22 +- **Région** : Montréal, Sainte-Foy
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Alphanumeric Systems` |
33 +| `ORG` | `alphanumeric-systems` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 40 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Bilingual Customer Service Specialist for Pharmaceuticals/Healthcare (English/French) - Fu…* — Montréal · $45,000 / year · parue le 2026-08-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 5/5 actives (100 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 2/5 actives (40 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync alphanumeric_systems` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='alphanumeric_systems' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Alphanumeric Systems » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/alphanumeric_systems.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/altasciences.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/altasciences.md
7 +Rôle : Fiche connecteur — Altasciences (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Altasciences (`altasciences`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/altasciences.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Altasciences]()
20 +- **Page carrières** : https://altasciences.wd1.myworkdayjobs.com/Careers
21 +- **Secteurs** : Pharmaceutique
22 +- **Région** : Laval
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Altasciences` |
33 +| `HOST` | `wd1` |
34 +| `SITE` | `Careers` |
35 +| `TENANT` | `altasciences` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **29 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Medical Equipment and Systems Specialist* — Montréal · ∅ · parue le 2026-08-11.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 29 (dont **29 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/29 actives (0 %)
83 +- **GPS** : 29/29 actives (100 %)
84 +- **Mode** : 0/29 actives (0 %)
85 +- **Parution** : 29/29 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 29, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync altasciences` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='altasciences' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Altasciences » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/altasciences.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/amilia.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/amilia.md
7 +Rôle : Fiche connecteur — Amilia (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Amilia (`amilia`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/amilia.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Amilia]()
20 +- **Page carrières** : https://amilia.recruitee.com
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Amilia` |
33 +| `ORG` | `amilia` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
61 +
62 +Exemple réel : *Talent & Culture, Coordinator (12-month contract)* — Greater Montreal · ∅ · parue le 2026-07-30.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 0/1 actives (0 %)
77 +- **Mode** : 1/1 actives (100 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync amilia` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='amilia' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Amilia » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/amilia.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/anciapersonnelinc.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/anciapersonnelinc.md
7 +Rôle : Fiche connecteur — ANCIA Personnel (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# ANCIA Personnel (`anciapersonnelinc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/anciapersonnelinc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [ANCIA Personnel]()
20 +- **Page carrières** : https://anciapersonnelinc.recruitee.com
21 +- **Secteurs** : Placement
22 +- **Région** : Lévis, Québec, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `ANCIA Personnel` |
33 +| `ORG` | `anciapersonnelinc` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **59 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 20 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 98 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 10 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 3 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 95 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Approvisionneur(euse) de pièces* — Saint-Eustache · Salaire horaire de 36,26$ à 40,74$ selon expérience; · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 59 (dont **59 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 6/59 actives (10 %)
76 +- **GPS** : 59/59 actives (100 %)
77 +- **Mode** : 59/59 actives (100 %)
78 +- **Parution** : 59/59 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 59, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync anciapersonnelinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='anciapersonnelinc' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez ANCIA Personnel » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/anciapersonnelinc.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/appdirect.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/appdirect.md
7 +Rôle : Fiche connecteur — AppDirect (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# AppDirect (`appdirect`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/appdirect.py`
16 +
17 +## Description
18 +
19 +- **Site** : [AppDirect]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/appdirect
21 +- **Secteurs** : TI, SaaS
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `appdirect` |
33 +| `EMPLOYER` | `AppDirect` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 26 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 26 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 87 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Développeur/Développeuse Logiciel Senior - PHP* — Montréal · $95,000 &mdash; $130,000 CAD · parue le 2026-08-13.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 6/23 actives (26 %)
76 +- **GPS** : 23/23 actives (100 %)
77 +- **Mode** : 0/23 actives (0 %)
78 +- **Parution** : 23/23 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 23, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync appdirect` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='appdirect' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez AppDirect » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/appdirect.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/astucemedia.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/astucemedia.md
7 +Rôle : Fiche connecteur — Astucemedia (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Astucemedia (`astucemedia`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/astucemedia.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Astucemedia]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/Astucemedia
21 +- **Secteurs** : Médias, TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `Astucemedia` |
33 +| `EMPLOYER` | `Astucemedia` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 40 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Lead Front & Back-End Developer* — Montréal · ∅ · parue le 2026-07-21.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/5 actives (0 %)
81 +- **GPS** : 5/5 actives (100 %)
82 +- **Mode** : 2/5 actives (40 %)
83 +- **Parution** : 5/5 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 5, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync astucemedia` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='astucemedia' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Astucemedia » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/astucemedia.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/atecna_montreal.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/atecna_montreal.md
7 +Rôle : Fiche connecteur — Atecna (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Atecna (`atecna_montreal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/atecna_montreal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Atecna]()
20 +- **Page carrières** : https://apply.workable.com/atecna-montreal
21 +- **Secteurs** : TI, Conseil
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Atecna` |
33 +| `ORG` | `atecna-montreal` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *UI-UX Designer Senior* — Montréal · ∅ · parue le 2026-07-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 1/1 actives (100 %)
77 +- **Mode** : 0/1 actives (0 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync atecna_montreal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='atecna_montreal' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Atecna » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/atecna_montreal.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-adp.md +63 −0
@@ -0,0 +1,63 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-adp.md
7 +Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 3 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `adp`
14 +
15 +**3 employeurs connectés** via cette plateforme — **12 offres actives**. Module partagé : `jobka/connectors/adp.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme ADP Workforce Now (workforcenow.adp.com).
20 +>
21 +> API JSON publique du centre de carrières :
22 +> - liste : GET /mascsr/default/careercenter/public/events/staffing/v1/
23 +> job-requisitions?cid=<CID>&ccId=<CCID>&lang=<fr_CA>&$top=&$skip=
24 +> -> {jobRequisitions:[{itemID, requisitionTitle, postDate,
25 +> payGradeRange, workLevelCode, requisitionLocations,
26 +> customFieldGroup}]}
27 +> - détail : GET .../job-requisitions/<itemID>?cid=… -> requisitionDescription
28 +> (HTML). Visité avec cache BD + budget.
29 +
30 +## Accès
31 +
32 +- **Endpoint** (`_API`) : `https://workforcenow.adp.com/mascsr/default/careercenter/public/events/staffing/v1/job-requisitions`
33 +- **Pagination** : flux unique (une requête liste)
34 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
35 +- **Auth** : aucune — API/pages publiques du site carrières.
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Budgets (env)** : `JOBKA_ADP_DETAIL_LIMIT` (défaut `80`)
38 +
39 +## Tenants connectés
40 +
41 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
42 +|---|---|---|---|---|---|---|
43 +| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 6 | 50 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
44 +| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
45 +| [Industries Lassonde](lassonde.md) | 0 | — | — | — | 2026-08-18 11:26 | ✅ |
46 +
47 +## Licence / conformité
48 +
49 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
50 +
51 +## Historique
52 +
53 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
54 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
55 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
56 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
57 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
58 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
59 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
60 +
61 +Commits touchant `jobka/connectors/adp.py` :
62 +
63 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-ashby.md +71 −0
@@ -0,0 +1,71 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-ashby.md
7 +Rôle : Fiche plateforme ATS ashby — mécanique partagée + tableau des 11 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `ashby`
14 +
15 +**11 employeurs connectés** via cette plateforme — **213 offres actives**. Module partagé : `jobka/connectors/ashby.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Ashby.
20 +>
21 +> API publique : GET https://api.ashbyhq.com/posting-api/job-board/<org>
22 +> ?includeCompensation=true
23 +> -> {jobs:[{id, title, location, secondaryLocations, department, team,
24 +> employmentType(FullTime|PartTime|Intern|Contract|Temporary), isRemote,
25 +> workplaceType, publishedAt, jobUrl, applyUrl, descriptionHtml,
26 +> descriptionPlain, compensation:{compensationTierSummary,
27 +> scrapeableCompensationSalarySummary, ...}}]}.
28 +>
29 +> Une seule requête liste TOUT (descriptions + salaires inclus) — l'ATS le plus
30 +> transparent sur les salaires.
31 +
32 +## Accès
33 +
34 +- **Pagination** : flux unique (une requête liste)
35 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
36 +- **Auth** : aucune — API/pages publiques du site carrières.
37 +- **Throttle** : 1.0 s entre requêtes.
38 +
39 +## Tenants connectés
40 +
41 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
42 +|---|---|---|---|---|---|---|
43 +| [MaintainX](maintainx.md) | 78 | 6 % | 83 % | 100 % | 2026-08-18 11:26 | ✅ |
44 +| [Lightspeed Commerce](lightspeedhq.md) | 56 | 7 % | 98 % | 100 % | 2026-08-18 11:26 | ✅ |
45 +| [Cohere](cohere.md) | 46 | 17 % | 37 % | 100 % | 2026-08-18 11:21 | ✅ |
46 +| [Tetrix](tetrix.md) | 9 | 100 % | 11 % | 100 % | 2026-08-18 11:31 | ✅ |
47 +| [Hopper](hopper.md) | 6 | 0 % | 67 % | 100 % | 2026-08-18 11:25 | ✅ |
48 +| [Mistral AI](mistral_ai.md) | 5 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
49 +| [Nomic Bio](nomic.md) | 4 | 0 % | 75 % | 100 % | 2026-08-18 11:27 | ✅ |
50 +| [Fuse Energy](fuse.md) | 3 | 0 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
51 +| [No Saint](no_saint.md) | 3 | 0 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
52 +| [Vasco](vasco.md) | 2 | 0 % | 100 % | 100 % | 2026-08-18 11:31 | ✅ |
53 +| [Industrious](industrious.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:25 | ✅ |
54 +
55 +## Licence / conformité
56 +
57 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
58 +
59 +## Historique
60 +
61 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
62 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
63 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
64 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
65 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
66 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
67 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
68 +
69 +Commits touchant `jobka/connectors/ashby.py` :
70 +
71 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-bamboohr.md +94 −0
@@ -0,0 +1,94 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-bamboohr.md
7 +Rôle : Fiche plateforme ATS bamboohr — mécanique partagée + tableau des 31 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `bamboohr`
14 +
15 +**31 employeurs connectés** via cette plateforme — **226 offres actives**. Module partagé : `jobka/connectors/bamboohr.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme BambooHR.
20 +>
21 +> API publique :
22 +> - liste : GET https://<org>.bamboohr.com/careers/list
23 +> -> {result:[{id, jobOpeningName, departmentLabel,
24 +> employmentStatusLabel, location:{city,state},
25 +> atsLocation:{country,state,city}, isRemote, locationType}]}
26 +> ⚠ Pour les postes Remote/Hybrid, location.city/state est souvent null —
27 +> le lieu réel est dans atsLocation : tester les DEUX pour le filtre Québec.
28 +> - détail : GET https://<org>.bamboohr.com/careers/<id>/detail
29 +> -> {result:{jobOpening:{description(HTML), compensation,
30 +> datePosted, minimumExperience, jobOpeningShareUrl}}}
31 +>
32 +> Page détail avec cache BD (clé = hash de la ligne de liste) + budget.
33 +
34 +## Accès
35 +
36 +- **Pagination** : flux unique (une requête liste)
37 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
38 +- **Auth** : aucune — API/pages publiques du site carrières.
39 +- **Throttle** : 0.8 s entre requêtes.
40 +- **Budgets (env)** : `JOBKA_BHR_DETAIL_LIMIT` (défaut `150`)
41 +
42 +## Tenants connectés
43 +
44 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
45 +|---|---|---|---|---|---|---|
46 +| [Broccolini](broccolini.md) | 23 | 0 % | 100 % | 4 % | 2026-08-18 11:19 | ✅ |
47 +| [dcbel](dcbel.md) | 20 | 0 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
48 +| [Explorance](explorance.md) | 18 | 0 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
49 +| [Produits Labelink](labelink.md) | 17 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
50 +| [OPAL-RT Technologies](opalrt.md) | 14 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
51 +| [Victoria Park Medispa](vicpark.md) | 13 | 0 % | 92 % | 0 % | 2026-08-18 11:31 | ✅ |
52 +| [Logisco](logisco.md) | 13 | 38 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
53 +| [KPI Digital](kpidigital.md) | 11 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
54 +| [Big Bang](bigbang.md) | 8 | 25 % | 100 % | 0 % | 2026-08-18 11:15 | ✅ |
55 +| [Robotiq](robotiq.md) | 7 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
56 +| [Devimco Appartements](devimco.md) | 7 | 14 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
57 +| [Triotech](triotech.md) | 6 | 17 % | 100 % | 0 % | 2026-08-18 11:31 | ✅ |
58 +| [North West Rubber](northwestrubber.md) | 6 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
59 +| [Nexapp](nexapp.md) | 6 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
60 +| [Portage CyberTech](portagecybertech.md) | 6 | 17 % | 100 % | 67 % | 2026-08-18 11:27 | ✅ |
61 +| [MXO](mxo.md) | 6 | 100 % | 0 % | 0 % | 2026-08-18 11:27 | ✅ |
62 +| [Propriétés Scalia](scalia.md) | 5 | 0 % | 100 % | 20 % | 2026-08-18 11:28 | ✅ |
63 +| [Surmesur](surmesur.md) | 5 | 80 % | 100 % | 20 % | 2026-08-18 11:29 | ✅ |
64 +| [Toon Boom Animation](toonboom.md) | 5 | 0 % | 100 % | 0 % | 2026-08-18 11:31 | ✅ |
65 +| [EOS Aircraft](eosaircraftinc.md) | 4 | 0 % | 100 % | 75 % | 2026-08-18 11:21 | ✅ |
66 +| [Mitacs](mitacs.md) | 4 | 100 % | 100 % | 50 % | 2026-08-18 11:27 | ✅ |
67 +| [Korem](korem.md) | 4 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
68 +| [Rethink](rethinkcanada.md) | 3 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
69 +| [Groupe BC2](bc2.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
70 +| [OTT Financial](ott.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
71 +| [Aliments Ouimet-Cordon Bleu inc.](cordonbleu.md) | 2 | 50 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
72 +| [EVLO (Hydro-Québec)](evlo.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
73 +| [Fenêtres Concept](fenetresconcept.md) | 2 | 100 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
74 +| [Flare (cybersécurité)](flare.md) | 2 | 50 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
75 +| [Ziptrek Tremblant](ziptrekeco.md) | 2 | 100 % | 0 % | 0 % | 2026-08-18 10:47 | ✅ |
76 +| [Poulet Rouge](pouletrouge.md) | 1 | 0 % | 0 % | 0 % | 2026-08-18 11:27 | ✅ |
77 +
78 +## Licence / conformité
79 +
80 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
81 +
82 +## Historique
83 +
84 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
85 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
86 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
87 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
88 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
89 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
90 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
91 +
92 +Commits touchant `jobka/connectors/bamboohr.py` :
93 +
94 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-breezy.md +71 −0
@@ -0,0 +1,71 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-breezy.md
7 +Rôle : Fiche plateforme ATS breezy — mécanique partagée + tableau des 14 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `breezy`
14 +
15 +**14 employeurs connectés** via cette plateforme — **132 offres actives**. Module partagé : `jobka/connectors/breezy.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Breezy HR.
20 +>
21 +> API publique : GET https://<org>.breezy.hr/json?verbose=true
22 +> -> liste de {id, friendly_id, name(titre), url(lien direct),
23 +> type:{id:"fullTime", name:"Temps plein"}, department,
24 +> location:{country:{id}, state:{id:"QC", name:"Quebec"}, city},
25 +> published_date(ISO), salary, description(HTML — seulement avec verbose)}.
26 +>
27 +> Le filtre le plus fiable est location.state.id == "QC". Une seule requête.
28 +
29 +## Accès
30 +
31 +- **Pagination** : flux unique (une requête liste)
32 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
33 +- **Auth** : aucune — API/pages publiques du site carrières.
34 +- **Throttle** : 1.0 s entre requêtes.
35 +
36 +## Tenants connectés
37 +
38 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
39 +|---|---|---|---|---|---|---|
40 +| [Brand Momentum](brandmomentum.md) | 27 | 67 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
41 +| [NOVIPRO](novipro.md) | 17 | 0 % | 100 % | 18 % | 2026-08-18 11:27 | ✅ |
42 +| [Réseau Mieux-Être](reseau_mieux_etre.md) | 15 | 0 % | 100 % | 13 % | 2026-08-18 11:27 | ✅ |
43 +| [MicroHabitat](microhabitat.md) | 13 | 100 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
44 +| [3 Brasseurs Canada](trois_brasseurs.md) | 11 | 73 % | 100 % | 100 % | 2026-08-18 11:31 | ✅ |
45 +| [EQ3](eq3_ltd.md) | 10 | 60 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
46 +| [Nora Pharma](nora_pharma.md) | 9 | 100 % | 89 % | 0 % | 2026-08-18 11:27 | ✅ |
47 +| [ADI - Albert Davidson Industries](adi_albert_davidson_industries.md) | 9 | 100 % | 100 % | 11 % | 2026-08-18 11:12 | ✅ |
48 +| [Luqia (INO)](ino_ca.md) | 7 | 0 % | 100 % | 0 % | 2026-08-18 11:25 | ✅ |
49 +| [Alphanumeric Systems](alphanumeric_systems.md) | 5 | 100 % | 100 % | 40 % | 2026-08-18 11:14 | ✅ |
50 +| [VOXDATA](voxdata.md) | 5 | 100 % | 80 % | 60 % | 2026-08-18 11:33 | ✅ |
51 +| [Vaporus](vaporus_inc.md) | 2 | 100 % | 50 % | 0 % | 2026-08-18 11:31 | ✅ |
52 +| [YouSet](youset.md) | 1 | 0 % | 100 % | 100 % | 2026-08-18 10:33 | ✅ |
53 +| [Canada Global Recruitment](canada_global.md) | 1 | 0 % | 0 % | 0 % | 2026-08-18 11:19 | ✅ |
54 +
55 +## Licence / conformité
56 +
57 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
58 +
59 +## Historique
60 +
61 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
62 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
63 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
64 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
65 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
66 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
67 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
68 +
69 +Commits touchant `jobka/connectors/breezy.py` :
70 +
71 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-digitalrecruiters.md +57 −0
@@ -0,0 +1,57 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-digitalrecruiters.md
7 +Rôle : Fiche plateforme ATS digitalrecruiters — mécanique partagée + tableau des 1 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `digitalrecruiters`
14 +
15 +**1 employeurs connectés** via cette plateforme — **49 offres actives**. Module partagé : `jobka/connectors/digitalrecruiters.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Cegid Digital Recruiters.
20 +>
21 +> Les sites carrières Digital Recruiters (ex. emplois.sante.quebec) sont rendus
22 +> côté serveur :
23 +> - liste : GET <BASE>/<locale>/sitemap.xml -> URLs /annonce/<id>-<slug>
24 +> - détail : chaque page annonce embarque un JSON-LD schema.org/JobPosting
25 +> complet (description, lieu, salaire, dates) — cache BD + budget.
26 +
27 +## Accès
28 +
29 +- **Pagination** : parcours de sitemap XML
30 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
31 +- **Auth** : aucune — API/pages publiques du site carrières.
32 +- **Throttle** : 0.8 s entre requêtes.
33 +- **Budgets (env)** : `JOBKA_DR_DETAIL_LIMIT` (défaut `120`)
34 +
35 +## Tenants connectés
36 +
37 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
38 +|---|---|---|---|---|---|---|
39 +| [Santé Québec](sante_quebec.md) | 49 | 98 % | 61 % | 0 % | 2026-08-18 11:27 | ✅ |
40 +
41 +## Licence / conformité
42 +
43 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
44 +
45 +## Historique
46 +
47 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
48 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
49 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
50 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
51 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
52 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
53 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
54 +
55 +Commits touchant `jobka/connectors/digitalrecruiters.py` :
56 +
57 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-greenhouse.md +77 −0
@@ -0,0 +1,77 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-greenhouse.md
7 +Rôle : Fiche plateforme ATS greenhouse — mécanique partagée + tableau des 20 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `greenhouse`
14 +
15 +**20 employeurs connectés** via cette plateforme — **195 offres actives**. Module partagé : `jobka/connectors/greenhouse.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Greenhouse.
20 +>
21 +> API publique : GET https://boards-api.greenhouse.io/v1/boards/<board>/jobs
22 +> avec ?content=true -> {jobs:[{id, title, absolute_url, location:{name},
23 +> first_published, updated_at, application_deadline, content(HTML échappé),
24 +> departments, offices, metadata}]}.
25 +>
26 +> Une seule requête liste TOUT (contenu inclus) : pas de page détail.
27 +> `application_deadline` alimente date_deadline (retrait automatique).
28 +
29 +## Accès
30 +
31 +- **Pagination** : flux unique (une requête liste)
32 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
33 +- **Auth** : aucune — API/pages publiques du site carrières.
34 +- **Throttle** : 1.0 s entre requêtes.
35 +
36 +## Tenants connectés
37 +
38 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
39 +|---|---|---|---|---|---|---|
40 +| [Levio](levio.md) | 42 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
41 +| [AppDirect](appdirect.md) | 23 | 26 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
42 +| [mthree](mthreerecruitingportal.md) | 22 | 0 % | 95 % | 23 % | 2026-08-18 11:27 | ✅ |
43 +| [Vooban](vooban.md) | 18 | 0 % | 100 % | 0 % | 2026-08-18 11:33 | ✅ |
44 +| [Valtech](valtech.md) | 16 | 12 % | 100 % | 0 % | 2026-08-18 11:31 | ✅ |
45 +| [Sid Lee](sidlee.md) | 15 | 0 % | 100 % | 0 % | 2026-08-18 11:28 | ✅ |
46 +| [AlayaCare](alayacare.md) | 10 | 0 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
47 +| [SIA Innovations](siainnovationsinc.md) | 9 | 56 % | 100 % | 78 % | 2026-08-18 11:28 | ✅ |
48 +| [GURUS Solutions](gurussolutions.md) | 8 | 0 % | 100 % | 0 % | 2026-08-18 11:25 | ✅ |
49 +| [Poka](poka.md) | 5 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
50 +| [TandemLaunch](tandemlaunch.md) | 5 | 40 % | 100 % | 0 % | 2026-08-18 11:29 | ✅ |
51 +| [Lush Cosmétiques](lush.md) | 5 | 100 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
52 +| [Broadsign](broadsign.md) | 4 | 0 % | 100 % | 100 % | 2026-08-18 11:19 | ✅ |
53 +| [Vaco](vaco.md) | 4 | 75 % | 100 % | 0 % | 2026-08-18 11:31 | ✅ |
54 +| [Gearbox Studio Québec](gearboxquebec.md) | 3 | 0 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
55 +| [On Running](onrunning.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
56 +| [VML Canada](vmlcanadaen.md) | 2 | 50 % | 100 % | 0 % | 2026-08-18 11:33 | ✅ |
57 +| [NATIONAL](national.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
58 +| [Samsara](samsara.md) | 1 | 100 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
59 +| [TTC Global](ttcglobal.md) | 0 | — | — | — | 2026-08-18 11:31 | ✅ |
60 +
61 +## Licence / conformité
62 +
63 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
64 +
65 +## Historique
66 +
67 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
68 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
69 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
70 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
71 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
72 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
73 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
74 +
75 +Commits touchant `jobka/connectors/greenhouse.py` :
76 +
77 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/ats-icims.md +64 −0
@@ -0,0 +1,64 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-icims.md
7 +Rôle : Fiche plateforme ATS icims — mécanique partagée + tableau des 5 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `icims`
14 +
15 +**5 employeurs connectés** via cette plateforme — **57 offres actives**. Module partagé : `jobka/connectors/icims.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme iCIMS.
20 +>
21 +> - liste : GET https://<sub>.icims.com/jobs/search?ss=1&in_iframe=1&pr=<page>
22 +> (HTML léger, liens /jobs/<id>/<slug>/job) — pagination pr=0,1,2…
23 +> - détail : GET https://<sub>.icims.com/jobs/<id>/<slug>/job?in_iframe=1
24 +> -> JSON-LD schema.org/JobPosting complet (description, lieu, dates)
25 +>
26 +> Le lieu n'apparaissant pas toujours sur la liste, le filtre Québec est
27 +> appliqué après lecture du détail (avec cache BD : chaque offre n'est visitée
28 +> qu'une fois).
29 +
30 +## Accès
31 +
32 +- **Pagination** : flux unique (une requête liste)
33 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
34 +- **Auth** : aucune — API/pages publiques du site carrières.
35 +- **Throttle** : 1.0 s entre requêtes.
36 +- **Budgets (env)** : `JOBKA_ICIMS_DETAIL_LIMIT` (défaut `150`)
37 +
38 +## Tenants connectés
39 +
40 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
41 +|---|---|---|---|---|---|---|
42 +| [McCarthy Tétrault](mccarthy_tetrault.md) | 22 | 0 % | 100 % | 9 % | 2026-08-18 11:26 | ✅ |
43 +| [CAPREIT](capreit.md) | 10 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
44 +| [EDF Renouvelables Canada](edf_renouvelables.md) | 9 | 67 % | 67 % | 67 % | 2026-08-18 11:21 | ✅ |
45 +| [Omni Hôtel Mont-Royal](omni_hotels_horaire.md) | 8 | 50 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
46 +| [Omni Hôtel Mont-Royal](omni_hotels_gestion.md) | 8 | 50 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
47 +
48 +## Licence / conformité
49 +
50 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
51 +
52 +## Historique
53 +
54 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
55 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
56 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
57 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
58 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
59 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
60 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
61 +
62 +Commits touchant `jobka/connectors/icims.py` :
63 +
64 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-lever.md +76 −0
@@ -0,0 +1,76 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-lever.md
7 +Rôle : Fiche plateforme ATS lever — mécanique partagée + tableau des 19 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `lever`
14 +
15 +**19 employeurs connectés** via cette plateforme — **457 offres actives**. Module partagé : `jobka/connectors/lever.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Lever.
20 +>
21 +> API publique : GET https://api.lever.co/v0/postings/<org>?mode=json
22 +> -> liste de {id, text, hostedUrl, createdAt(epoch ms), country,
23 +> workplaceType(remote|hybrid|on-site|unspecified), descriptionBodyPlain,
24 +> categories:{location, allLocations, commitment, team, department},
25 +> salaryRange:{min, max, currency, interval} quand publié}.
26 +>
27 +> Une seule requête liste TOUT (descriptions incluses) : pas de page détail.
28 +
29 +## Accès
30 +
31 +- **Pagination** : flux unique (une requête liste)
32 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
33 +- **Auth** : aucune — API/pages publiques du site carrières.
34 +- **Throttle** : 1.0 s entre requêtes.
35 +
36 +## Tenants connectés
37 +
38 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
39 +|---|---|---|---|---|---|---|
40 +| [Go RH](gorh.md) | 266 | 18 % | 97 % | 98 % | 2026-08-18 11:24 | ✅ |
41 +| [Behaviour Interactif](bhvr.md) | 39 | 3 % | 100 % | 100 % | 2026-08-18 11:15 | ✅ |
42 +| [Cirque du Soleil](cirquedusoleil.md) | 22 | 0 % | 86 % | 100 % | 2026-08-18 11:21 | ✅ |
43 +| [Xsolla](xsolla.md) | 21 | 95 % | 95 % | 100 % | 2026-08-18 10:33 | ✅ |
44 +| [OSEDEA](osedea.md) | 18 | 0 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
45 +| [VO2 Group](vo2_group.md) | 17 | 6 % | 100 % | 100 % | 2026-08-18 11:33 | ✅ |
46 +| [Spiria](spiria.md) | 16 | 69 % | 100 % | 100 % | 2026-08-18 11:28 | ✅ |
47 +| [TSMG](tsmg.md) | 11 | 0 % | 100 % | 100 % | 2026-08-18 11:31 | ✅ |
48 +| [Mirego](mirego.md) | 11 | 0 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
49 +| [EQ Bank](eqbank.md) | 6 | 17 % | 50 % | 100 % | 2026-08-18 11:21 | ✅ |
50 +| [US Mobile](usmobile.md) | 6 | 100 % | 100 % | 100 % | 2026-08-18 11:31 | ✅ |
51 +| [Distro](distro.md) | 5 | 100 % | 100 % | 100 % | 2026-08-18 11:21 | ✅ |
52 +| [Aviya Aerospace Systems](aviyatech.md) | 5 | 0 % | 100 % | 100 % | 2026-08-18 11:14 | ✅ |
53 +| [Mistplay](mistplay.md) | 3 | 33 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
54 +| [DiliTrust](dilitrust.md) | 3 | 0 % | 100 % | 100 % | 2026-08-18 11:21 | ✅ |
55 +| [Potloc](potloc.md) | 2 | 0 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
56 +| [Spreedly](spreedly.md) | 2 | 0 % | 100 % | 100 % | 2026-08-18 11:28 | ✅ |
57 +| [Alimentiv](alimentiv_2.md) | 2 | 100 % | 50 % | 100 % | 2026-08-18 11:14 | ✅ |
58 +| [Dulcedo Management](dulcedo.md) | 2 | 50 % | 50 % | 100 % | 2026-08-18 11:21 | ✅ |
59 +
60 +## Licence / conformité
61 +
62 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
63 +
64 +## Historique
65 +
66 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
67 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
68 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
69 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
70 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
71 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
72 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
73 +
74 +Commits touchant `jobka/connectors/lever.py` :
75 +
76 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/ats-njoyn.md +69 −0
@@ -0,0 +1,69 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-njoyn.md
7 +Rôle : Fiche plateforme ATS njoyn — mécanique partagée + tableau des 5 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `njoyn`
14 +
15 +**5 employeurs connectés** via cette plateforme — **119 offres actives**. Module partagé : `jobka/connectors/njoyn.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Njoyn (CGI).
20 +>
21 +> Les babillards Njoyn servent un HTML rendu côté serveur :
22 +> <BASE>/<CL>/xweb/xweb.asp?clid=<CLID>&page=joblisting&lang=<n>
23 +> Le serveur redirige en ajoutant un jeton de session (tbtoken) — il suffit de
24 +> suivre la redirection. Chaque offre est un <article> (habillage moderne) ou
25 +> une ligne de tableau (habillage classique) pointant vers
26 +> ``page=jobdetails&jobid=J####-####``.
27 +>
28 +> ⚠ Les domaines *.njoyn.com sont derrière Radware Bot Manager : pour ces
29 +> tenants, mettre ``USE_SCRAPFLY = True`` (contournement ASP). Les babillards
30 +> servis sur un domaine personnalisé (ex. emplois.santemontreal.qc.ca) se
31 +> consultent directement.
32 +
33 +## Accès
34 +
35 +- **Pagination** : par numéro de page
36 +- **Backend** : Scrapfly (anti-bot / rendu JS) via `BaseConnector.scrapfly()`
37 +- **Auth** : aucune — API/pages publiques du site carrières.
38 +- **Throttle** : 1.2 s entre requêtes.
39 +- **Budgets (env)** : `JOBKA_NJOYN_DETAIL_LIMIT` (défaut `40`)
40 +
41 +## Tenants connectés
42 +
43 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
44 +|---|---|---|---|---|---|---|
45 +| [Santé Québec — Montréal](sante_montreal.md) | 50 | 98 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
46 +| [Réseau de transport de la Capitale](rtc_quebec.md) | 19 | 0 % | 0 % | 0 % | 2026-08-18 11:27 | ✅ |
47 +| [Ville de Gatineau](ville_gatineau.md) | 18 | 94 % | 0 % | 0 % | 2026-08-18 11:33 | ✅ |
48 +| [Ville de Terrebonne](ville_terrebonne.md) | 16 | 88 % | 0 % | 0 % | 2026-08-18 11:33 | ✅ |
49 +| [Société de transport de Laval](stl_laval.md) | 16 | 25 % | 0 % | 0 % | 2026-08-18 11:29 | ✅ |
50 +
51 +## Licence / conformité
52 +
53 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
54 +
55 +Certains domaines de cette plateforme sont servis derrière un gestionnaire anti-bot : la lecture passe alors par Scrapfly, toujours sur des pages strictement publiques, au même rythme throttlé.
56 +
57 +## Historique
58 +
59 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
60 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
61 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
62 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
63 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
64 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
65 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
66 +
67 +Commits touchant `jobka/connectors/njoyn.py` :
68 +
69 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-recruitee.md +69 −0
@@ -0,0 +1,69 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-recruitee.md
7 +Rôle : Fiche plateforme ATS recruitee — mécanique partagée + tableau des 11 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `recruitee`
14 +
15 +**11 employeurs connectés** via cette plateforme — **130 offres actives**. Module partagé : `jobka/connectors/recruitee.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Recruitee.
20 +>
21 +> API publique : GET https://<org>.recruitee.com/api/offers/
22 +> -> {offers:[{id, title, city, state_code, state_name, country_code,
23 +> postal_code, remote, hybrid, on_site, employment_type_code,
24 +> description(HTML, dans la liste), requirements(HTML),
25 +> salary:{min, max, period, currency}, careers_url, published_at
26 +> ("2026-08-11 19:27:47 UTC"), close_at, company_name}]}.
27 +>
28 +> Une seule requête liste TOUT (descriptions + salaires structurés).
29 +
30 +## Accès
31 +
32 +- **Pagination** : flux unique (une requête liste)
33 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
34 +- **Auth** : aucune — API/pages publiques du site carrières.
35 +- **Throttle** : 1.0 s entre requêtes.
36 +
37 +## Tenants connectés
38 +
39 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
40 +|---|---|---|---|---|---|---|
41 +| [ANCIA Personnel](anciapersonnelinc.md) | 59 | 10 % | 100 % | 100 % | 2026-08-18 11:14 | ✅ |
42 +| [Huawei Canada](huaweicanada.md) | 18 | 11 % | 100 % | 100 % | 2026-08-18 11:25 | ✅ |
43 +| [LG2](lg2.md) | 14 | 7 % | 100 % | 100 % | 2026-08-18 11:26 | ✅ |
44 +| [Framestore](framestore.md) | 9 | 0 % | 100 % | 100 % | 2026-08-18 11:24 | ✅ |
45 +| [Petal](petalmd.md) | 7 | 14 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
46 +| [AJ Walter Aviation](ajwalter.md) | 7 | 0 % | 100 % | 100 % | 2026-08-18 11:14 | ✅ |
47 +| [Adèle Express](adeleexpressfr.md) | 5 | 60 % | 100 % | 100 % | 2026-08-18 11:12 | ✅ |
48 +| [Médialo](medialo.md) | 5 | 0 % | 80 % | 100 % | 2026-08-18 11:26 | ✅ |
49 +| [Squeeze Studio Animation](squeezestudio.md) | 3 | 0 % | 67 % | 100 % | 2026-08-18 11:28 | ✅ |
50 +| [BIXI Montréal](biximontreal.md) | 2 | 100 % | 100 % | 100 % | 2026-08-18 11:15 | ✅ |
51 +| [Amilia](amilia.md) | 1 | 0 % | 0 % | 100 % | 2026-08-18 11:14 | ✅ |
52 +
53 +## Licence / conformité
54 +
55 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
56 +
57 +## Historique
58 +
59 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
60 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
61 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
62 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
63 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
64 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
65 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
66 +
67 +Commits touchant `jobka/connectors/recruitee.py` :
68 +
69 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-smartrecruiters.md +89 −0
@@ -0,0 +1,89 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-smartrecruiters.md
7 +Rôle : Fiche plateforme ATS smartrecruiters — mécanique partagée + tableau des 28 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `smartrecruiters`
14 +
15 +**28 employeurs connectés** via cette plateforme — **958 offres actives**. Module partagé : `jobka/connectors/smartrecruiters.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme SmartRecruiters.
20 +>
21 +> API publique :
22 +> - liste : GET https://api.smartrecruiters.com/v1/companies/<company>/postings
23 +> ?limit=100&offset=N -> {totalFound, content:[{id, name, releasedDate,
24 +> location:{city, region, country, remote, latitude, longitude},
25 +> typeOfEmployment:{label}, experienceLevel, ref}]}
26 +> - détail : GET .../postings/<id> -> {jobAd:{sections:{jobDescription,
27 +> qualifications, additionalInformation:{title, text(HTML)}}}}
28 +>
29 +> Le lieu inclut lat/lng : on les passe directement (validés par finalize()).
30 +> Page détail avec cache BD (clé = releasedDate) + budget de requêtes.
31 +
32 +## Accès
33 +
34 +- **Pagination** : offset/limit
35 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
36 +- **Auth** : aucune — API/pages publiques du site carrières.
37 +- **Throttle** : 0.7 s entre requêtes.
38 +- **Budgets (env)** : `JOBKA_SR_DETAIL_LIMIT` (défaut `300`)
39 +
40 +## Tenants connectés
41 +
42 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
43 +|---|---|---|---|---|---|---|
44 +| [CIMA+](cima2.md) | 221 | 0 % | 100 % | 84 % | 2026-08-18 11:19 | ✅ |
45 +| [Reitmans](reitmanscanadalteltd.md) | 142 | 22 % | 100 % | 31 % | 2026-08-18 11:27 | ✅ |
46 +| [Ubisoft](ubisoft.md) | 125 | 0 % | 100 % | 2 % | 2026-08-18 11:31 | ✅ |
47 +| [Vidéotron](videotron.md) | 78 | 35 % | 100 % | 42 % | 2026-08-18 11:31 | ✅ |
48 +| [EMCO](emcocorporation.md) | 67 | 30 % | 100 % | 22 % | 2026-08-18 11:21 | ✅ |
49 +| [Groupe Canam](groupecanam.md) | 67 | 63 % | 99 % | 27 % | 2026-08-18 11:24 | ✅ |
50 +| [Techo-Bloc](techo_bloc.md) | 40 | 40 % | 100 % | 20 % | 2026-08-18 11:31 | ✅ |
51 +| [Transat A.T.](transatat1.md) | 39 | 5 % | 97 % | 54 % | 2026-08-18 11:31 | ✅ |
52 +| [QSL](qsl.md) | 37 | 38 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
53 +| [MEDFAR Solutions Cliniques](medfar.md) | 23 | 0 % | 100 % | 96 % | 2026-08-18 11:26 | ✅ |
54 +| [Rodeo FX](rodeofx.md) | 20 | 0 % | 100 % | 10 % | 2026-08-18 11:27 | ✅ |
55 +| [Vosker](vosker.md) | 20 | 0 % | 100 % | 85 % | 2026-08-18 11:33 | ✅ |
56 +| [Gameloft](gameloft.md) | 15 | 0 % | 100 % | 73 % | 2026-08-18 11:24 | ✅ |
57 +| [Talan](talan.md) | 13 | 0 % | 100 % | 85 % | 2026-08-18 11:29 | ✅ |
58 +| [J'Excelle](jexcelleinc.md) | 9 | 0 % | 100 % | 11 % | 2026-08-18 11:26 | ✅ |
59 +| [CF Montréal](cfmontreal.md) | 8 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
60 +| [People Can Fly](peoplecanfly.md) | 8 | 0 % | 100 % | 100 % | 2026-08-18 11:27 | ✅ |
61 +| [Mattel (Mega Bloks)](mattelinc.md) | 6 | 0 % | 100 % | 17 % | 2026-08-18 11:26 | ✅ |
62 +| [Astucemedia](astucemedia.md) | 5 | 0 % | 100 % | 40 % | 2026-08-18 11:14 | ✅ |
63 +| [HoYoverse](hoyoverse.md) | 4 | 0 % | 100 % | 100 % | 2026-08-18 11:25 | ✅ |
64 +| [ServiceNow](servicenow.md) | 2 | 0 % | 100 % | 100 % | 2026-08-18 11:28 | ✅ |
65 +| [Venture Media](venturemedia.md) | 2 | 50 % | 100 % | 50 % | 2026-08-18 11:31 | ✅ |
66 +| [Playmind](playmind.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
67 +| [Sparkgrid](sparkgrid.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:28 | ✅ |
68 +| [Xplornet](xplornet.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 10:33 | ✅ |
69 +| [GoLogic](gologic.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:24 | ✅ |
70 +| [Stelpro](stelpro.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:28 | ✅ |
71 +| [Talsom](talsom.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:29 | ✅ |
72 +
73 +## Licence / conformité
74 +
75 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
76 +
77 +## Historique
78 +
79 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
80 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
81 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
82 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
83 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
84 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
85 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
86 +
87 +Commits touchant `jobka/connectors/smartrecruiters.py` :
88 +
89 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/ats-successfactors.md +61 −0
@@ -0,0 +1,61 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-successfactors.md
7 +Rôle : Fiche plateforme ATS successfactors — mécanique partagée + tableau des 3 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `successfactors`
14 +
15 +**3 employeurs connectés** via cette plateforme — **1049 offres actives**. Module partagé : `jobka/connectors/successfactors.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme SAP SuccessFactors (Career Site Builder, ex-jobs2web).
20 +>
21 +> Deux formats de « sitemap.xml » selon la génération du site :
22 +> - RSS 2.0 : <item> avec titre « Poste (VILLE, PROV, PAYS[, CP]) » ET la
23 +> description HTML complète — tout en une requête ;
24 +> - urlset : URLs /job/<Ville>-<titre>-<Prov>-<CP>/<id>/ + lastmod ; la
25 +> description est lue sur la page détail (microdonnées itemprop, avec cache
26 +> BD + budget). Le filtre Québec s'appuie sur la province/le code postal
27 +> présents dans le slug — aucun détail hors Québec n'est visité.
28 +
29 +## Accès
30 +
31 +- **Pagination** : parcours de sitemap XML
32 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
33 +- **Auth** : aucune — API/pages publiques du site carrières.
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Budgets (env)** : `JOBKA_SF_DETAIL_LIMIT` (défaut `150`)
36 +
37 +## Tenants connectés
38 +
39 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
40 +|---|---|---|---|---|---|---|
41 +| [Bombardier](bombardier.md) | 843 | 0 % | 82 % | 45 % | 2026-08-18 11:19 | ✅ |
42 +| [Domtar](domtar.md) | 107 | 0 % | 99 % | 0 % | 2026-08-18 11:21 | ✅ |
43 +| [Cascades](cascades.md) | 99 | 75 % | 99 % | 12 % | 2026-08-18 11:19 | ✅ |
44 +
45 +## Licence / conformité
46 +
47 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
48 +
49 +## Historique
50 +
51 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
52 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
53 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
54 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
55 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
56 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
57 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
58 +
59 +Commits touchant `jobka/connectors/successfactors.py` :
60 +
61 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-taleo.md +69 −0
@@ -0,0 +1,69 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-taleo.md
7 +Rôle : Fiche plateforme ATS taleo — mécanique partagée + tableau des 4 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `taleo`
14 +
15 +**4 employeurs connectés** via cette plateforme — **68 offres actives**. Module partagé : `jobka/connectors/taleo.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Oracle Taleo Enterprise.
20 +>
21 +> Les sections carrières Taleo exposent une API REST publique (celle que le
22 +> frontal jobsearch.ftl consomme lui-même) :
23 +> - amorce : GET https://<host>.taleo.net/careersection/<section>/jobsearch.ftl
24 +> (cookies de session + numéro de portail « portal=NNN » dans le HTML)
25 +> - liste : POST https://<host>.taleo.net/careersection/rest/jobboard/searchjobs
26 +> ?lang=fr&portal=<NNN> body JSON {pageNo, sorting…}
27 +> -> {requisitionList:[{jobId, contestNo, column:[...],
28 +> locationsColumns:[i]}], pagingData:{totalCount, pageSize}}
29 +> - détail : la page jobdetail.ftl?job=<contestNo> (description HTML rendue
30 +> côté serveur) — visitée avec cache BD et budget.
31 +>
32 +> Le contenu des colonnes dépend de la configuration du portail : on repère la
33 +> colonne des lieux via `locationsColumns` et on suppose la première colonne
34 +> comme titre (constaté sur tous les portails testés).
35 +
36 +## Accès
37 +
38 +- **Pagination** : flux unique (une requête liste)
39 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
40 +- **Auth** : aucune — API/pages publiques du site carrières.
41 +- **Throttle** : 1.0 s entre requêtes.
42 +- **Budgets (env)** : `JOBKA_TALEO_DETAIL_LIMIT` (défaut `120`)
43 +
44 +## Tenants connectés
45 +
46 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
47 +|---|---|---|---|---|---|---|
48 +| [CIUSSS de l'Est-de-l'Île-de-Montréal](ciusss_est_montreal.md) | 23 | 0 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
49 +| [Agnico Eagle Mines](agnico_eagle.md) | 18 | 0 % | 100 % | 0 % | 2026-08-18 11:12 | ✅ |
50 +| [Bell Textron Canada](bell_textron.md) | 15 | 0 % | 100 % | 0 % | 2026-08-18 11:15 | ✅ |
51 +| [Bayshore HealthCare](bayshore.md) | 12 | 0 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
52 +
53 +## Licence / conformité
54 +
55 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
56 +
57 +## Historique
58 +
59 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
60 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
61 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
62 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
63 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
64 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
65 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
66 +
67 +Commits touchant `jobka/connectors/taleo.py` :
68 +
69 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-ultipro.md +61 −0
@@ -0,0 +1,61 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-ultipro.md
7 +Rôle : Fiche plateforme ATS ultipro — mécanique partagée + tableau des 1 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `ultipro`
14 +
15 +**1 employeurs connectés** via cette plateforme — **22 offres actives**. Module partagé : `jobka/connectors/ultipro.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme UKG Pro Recruiting (recruiting.ultipro.com).
20 +>
21 +> API JSON publique (celle du frontal) :
22 +> - liste : POST https://recruiting.ultipro.com/<ORG>/JobBoard/<BOARD>/
23 +> JobBoardView/LoadSearchResults
24 +> body {opportunitySearch:{Top, Skip, OrderBy…}}
25 +> -> {opportunities:[{Id, Title, RequisitionNumber, BriefDescription,
26 +> FullTime, JobCategoryName, PostedDate, Locations:[{Address}]}],
27 +> totalCount}
28 +> - détail : POST .../JobBoardView/LoadOpportunity {opportunityId} -> Description
29 +> complète (HTML). Visité avec cache BD + budget.
30 +
31 +## Accès
32 +
33 +- **Pagination** : flux unique (une requête liste)
34 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
35 +- **Auth** : aucune — API/pages publiques du site carrières.
36 +- **Throttle** : 0.8 s entre requêtes.
37 +- **Budgets (env)** : `JOBKA_ULTIPRO_DETAIL_LIMIT` (défaut `80`)
38 +
39 +## Tenants connectés
40 +
41 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
42 +|---|---|---|---|---|---|---|
43 +| [Messer Canada](messer_canada.md) | 22 | 91 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
44 +
45 +## Licence / conformité
46 +
47 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
48 +
49 +## Historique
50 +
51 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
52 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
53 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
54 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
55 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
56 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
57 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
58 +
59 +Commits touchant `jobka/connectors/ultipro.py` :
60 +
61 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/ats-workable.md +78 −0
@@ -0,0 +1,78 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-workable.md
7 +Rôle : Fiche plateforme ATS workable — mécanique partagée + tableau des 19 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `workable`
14 +
15 +**19 employeurs connectés** via cette plateforme — **689 offres actives**. Module partagé : `jobka/connectors/workable.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Workable.
20 +>
21 +> API publique : GET https://apply.workable.com/api/v1/widget/accounts/<org>
22 +> ?details=true
23 +> -> {name, jobs:[{title, shortcode, employment_type("Full-time"…),
24 +> telecommuting(bool), department, url, published_on("2026-06-19"),
25 +> country, city, state, locations:[{country, countryCode, city, region}],
26 +> education, experience, description(HTML)}]}.
27 +>
28 +> Une seule requête liste TOUT (descriptions incluses). Pas de salaire dans le
29 +> widget v1 — finalize() tente l'extraction depuis la description.
30 +
31 +## Accès
32 +
33 +- **Pagination** : flux unique (une requête liste)
34 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
35 +- **Auth** : aucune — API/pages publiques du site carrières.
36 +- **Throttle** : 1.0 s entre requêtes.
37 +
38 +## Tenants connectés
39 +
40 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
41 +|---|---|---|---|---|---|---|
42 +| [TEHORA](tehora.md) | 389 | 0 % | 100 % | 29 % | 2026-08-18 11:31 | ✅ |
43 +| [Genetec](genetec_inc.md) | 79 | 0 % | 100 % | 18 % | 2026-08-18 11:24 | ✅ |
44 +| [SOGECLAIR](sogeclair.md) | 43 | 2 % | 100 % | 2 % | 2026-08-18 11:28 | ✅ |
45 +| [Valsoft](valsoft_corp.md) | 37 | 11 % | 100 % | 16 % | 2026-08-18 11:31 | ✅ |
46 +| [Side (PTW)](sideinc.md) | 32 | 0 % | 100 % | 19 % | 2026-08-18 11:28 | ✅ |
47 +| [Tecsys](tecsys.md) | 27 | 0 % | 100 % | 93 % | 2026-08-18 11:31 | ✅ |
48 +| [Evolving Web](evolving_web.md) | 14 | 0 % | 100 % | 14 % | 2026-08-18 11:24 | ✅ |
49 +| [Lamour](lamour.md) | 10 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
50 +| [Eminent Valet](eminent_valet.md) | 9 | 100 % | 100 % | 0 % | 2026-08-18 11:21 | ✅ |
51 +| [Botpress](botpress.md) | 8 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
52 +| [LIDD Consultants](lidd.md) | 8 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
53 +| [Nuovo Photography](nuovophotography.md) | 8 | 12 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
54 +| [Mila — Institut québécois d'IA](mila_2.md) | 8 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
55 +| [Sweat Pants Agency](sweat_pants_agency.md) | 6 | 100 % | 100 % | 100 % | 2026-08-18 11:29 | ✅ |
56 +| [Flinks](flinks.md) | 3 | 100 % | 100 % | 100 % | 2026-08-18 11:24 | ✅ |
57 +| [Unit8](unit8.md) | 3 | 0 % | 100 % | 67 % | 2026-08-18 11:31 | ✅ |
58 +| [Bardel Entertainment](bardel_entertainment.md) | 3 | 33 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
59 +| [Atecna](atecna_montreal.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
60 +| [Charger Logistics](charger_logistics_inc.md) | 1 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
61 +
62 +## Licence / conformité
63 +
64 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
65 +
66 +## Historique
67 +
68 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
69 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
70 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
71 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
72 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
73 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
74 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
75 +
76 +Commits touchant `jobka/connectors/workable.py` :
77 +
78 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ats-workday.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-workday.md
7 +Rôle : Fiche plateforme ATS workday — mécanique partagée + tableau des 41 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `workday`
14 +
15 +**41 employeurs connectés** via cette plateforme — **3552 offres actives**. Module partagé : `jobka/connectors/workday.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Workday.
20 +>
21 +> L'API publique des sites carrières Workday est stable et non authentifiée :
22 +> - liste : POST https://<tenant>.<host>.myworkdayjobs.com/wday/cxs/<tenant>/<site>/jobs
23 +> body {"appliedFacets":{},"limit":20,"offset":N,"searchText":""}
24 +> -> {total, jobPostings:[{title, externalPath, locationsText,
25 +> postedOn, bulletFields:[req_id]}]}
26 +> - détail : GET .../wday/cxs/<tenant>/<site><externalPath>
27 +> -> {jobPostingInfo:{jobDescription(HTML), location, timeType,
28 +> jobReqId, startDate, …}}
29 +>
30 +> Les sites listent souvent des postes hors Québec : on filtre côté client par
31 +> `is_quebec_location`, puis on ne visite la page détail QUE pour les postes
32 +> québécois (avec cache BD — le détail n'est re-téléchargé que si la ligne de
33 +> liste change).
34 +
35 +## Accès
36 +
37 +- **Pagination** : offset/limit
38 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
39 +- **Auth** : aucune — API/pages publiques du site carrières.
40 +- **Throttle** : 0.7 s entre requêtes.
41 +- **Budgets (env)** : `JOBKA_WORKDAY_DETAIL_LIMIT` (défaut `300`)
42 +
43 +## Tenants connectés
44 +
45 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
46 +|---|---|---|---|---|---|---|
47 +| [Couche-Tard / Circle K](circlek.md) | 1005 | 45 % | 63 % | 0 % | 2026-08-18 11:21 | ✅ |
48 +| [Walmart Canada](walmart.md) | 972 | 0 % | 0 % | 0 % | 2026-08-18 10:43 | ✅ |
49 +| [Mouvement Desjardins](desjardins.md) | 245 | 0 % | 94 % | 20 % | 2026-08-18 11:21 | ✅ |
50 +| [Université McGill](mcgill.md) | 180 | 18 % | 96 % | 0 % | 2026-08-18 11:26 | ✅ |
51 +| [BMO Groupe financier](bmo.md) | 107 | 84 % | 79 % | 17 % | 2026-08-18 11:15 | ✅ |
52 +| [Groupe Banque TD](td.md) | 76 | 97 % | 100 % | 0 % | 2026-08-18 11:31 | ✅ |
53 +| [Agropur](agropur.md) | 75 | 91 % | 99 % | 0 % | 2026-08-18 11:12 | ✅ |
54 +| [Airbus Canada](airbus.md) | 73 | 1 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
55 +| [Autodesk](autodesk.md) | 67 | 91 % | 48 % | 19 % | 2026-08-18 11:14 | ✅ |
56 +| [Banque CIBC](cibc.md) | 63 | 2 % | 100 % | 3 % | 2026-08-18 11:19 | ✅ |
57 +| [CAE](cae.md) | 52 | 8 % | 92 % | 0 % | 2026-08-18 11:19 | ✅ |
58 +| [Manuvie](manulife.md) | 51 | 90 % | 71 % | 31 % | 2026-08-18 11:26 | ✅ |
59 +| [Cogeco](cogeco.md) | 48 | 17 % | 56 % | 4 % | 2026-08-18 11:21 | ✅ |
60 +| [Beneva](beneva.md) | 48 | 2 % | 100 % | 2 % | 2026-08-18 11:15 | ✅ |
61 +| [Investissements PSP](investpsp.md) | 44 | 2 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
62 +| [McKesson Canada](mckesson.md) | 43 | 81 % | 86 % | 2 % | 2026-08-18 11:26 | ✅ |
63 +| [Promutuel Assurance](promutuel.md) | 37 | 0 % | 100 % | 16 % | 2026-08-18 11:27 | ✅ |
64 +| [Service alimentaire Gordon](gfs.md) | 31 | 55 % | 0 % | 0 % | 2026-08-18 11:24 | ✅ |
65 +| [Altasciences](altasciences.md) | 29 | 0 % | 100 % | 0 % | 2026-08-18 11:14 | ✅ |
66 +| [CDPQ — Caisse de dépôt et placement du Québec](cdpq.md) | 27 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
67 +| [EXFO](exfo.md) | 27 | 0 % | 100 % | 56 % | 2026-08-18 11:24 | ✅ |
68 +| [Scotts Canada (Fafard)](scottsmiraclegro.md) | 27 | 4 % | 0 % | 0 % | 2026-08-18 11:28 | ✅ |
69 +| [Saputo](saputo.md) | 25 | 80 % | 100 % | 0 % | 2026-08-18 11:28 | ✅ |
70 +| [Intact Corporation financière](intactfc.md) | 23 | 0 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
71 +| [Rio Tinto](riotinto.md) | 23 | 0 % | 100 % | 4 % | 2026-08-18 11:27 | ✅ |
72 +| [CAA-Québec](caaquebec.md) | 19 | 16 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
73 +| [iA Groupe financier](ia_groupe.md) | 16 | 6 % | 100 % | 6 % | 2026-08-18 11:25 | ✅ |
74 +| [Alcoa Canada](alcoa.md) | 16 | 12 % | 44 % | 0 % | 2026-08-18 11:14 | ✅ |
75 +| [BDC](bdc.md) | 16 | 0 % | 100 % | 0 % | 2026-08-18 11:15 | ✅ |
76 +| [Investissement Québec](investquebec.md) | 13 | 8 % | 100 % | 0 % | 2026-08-18 11:26 | ✅ |
77 +| [GSK](gsk.md) | 12 | 0 % | 83 % | 0 % | 2026-08-18 11:24 | ✅ |
78 +| [Fonds de solidarité FTQ](fondsftq.md) | 10 | 0 % | 100 % | 100 % | 2026-08-18 11:24 | ✅ |
79 +| [JG Rive-Sud (GFS)](jgrivesud.md) | 10 | 70 % | 0 % | 0 % | 2026-08-18 11:26 | ✅ |
80 +| [Sun Life](sunlife.md) | 9 | 0 % | 100 % | 0 % | 2026-08-18 11:29 | ✅ |
81 +| [Canadian Tire](canadiantirecorporation.md) | 9 | 56 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
82 +| [Church & Dwight Canada](churchdwight.md) | 6 | 0 % | 100 % | 0 % | 2026-08-18 11:19 | ✅ |
83 +| [Raymond Chabot Grant Thornton](rcgt.md) | 5 | 0 % | 100 % | 20 % | 2026-08-18 11:27 | ✅ |
84 +| [Pfizer Canada](pfizer.md) | 4 | 100 % | 0 % | 0 % | 2026-08-18 11:27 | ✅ |
85 +| [Plusgrade](plusgrade.md) | 4 | 0 % | 100 % | 0 % | 2026-08-18 11:27 | ✅ |
86 +| [Brasseries Sleeman (Unibroue)](sleeman.md) | 3 | 33 % | 0 % | 0 % | 2026-08-18 11:28 | ✅ |
87 +| [Suncor Énergie](suncor.md) | 2 | 0 % | 100 % | 0 % | 2026-08-18 11:29 | ✅ |
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/workday.py` :
104 +
105 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/ats-workland.md +57 −0
@@ -0,0 +1,57 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ats-workland.md
7 +Rôle : Fiche plateforme ATS workland — mécanique partagée + tableau des 1 tenants
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plateforme ATS `workland`
14 +
15 +**1 employeurs connectés** via cette plateforme — **23 offres actives**. Module partagé : `jobka/connectors/workland.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 +
17 +## Description & mécanique
18 +
19 +> Plateforme Workland (atlas.workland.com).
20 +>
21 +> Les pages atlas.workland.com sont une SPA Angular sans données côté serveur
22 +> (le bloc JSON-LD reste vide même après rendu) : on s'appuie donc sur la page
23 +> carrières de l'employeur (LIST_URL), rendue côté serveur, qui liste les liens
24 +> https://atlas.workland.com/work/<id>/<slug> — typiquement dans un tableau
25 +> « titre | date limite | lien » (ex. CSSDM). Le titre et la date limite
26 +> proviennent de la ligne du tableau ; à défaut, du slug.
27 +
28 +## Accès
29 +
30 +- **Pagination** : flux unique (une requête liste)
31 +- **Backend** : GET/POST direct `requests` (throttlé, User-Agent `JobKaBot/1.0` identifié)
32 +- **Auth** : aucune — API/pages publiques du site carrières.
33 +- **Throttle** : 1.0 s entre requêtes.
34 +
35 +## Tenants connectés
36 +
37 +| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |
38 +|---|---|---|---|---|---|---|
39 +| [Centre de services scolaire de Montréal](cssdm.md) | 23 | 0 % | 0 % | 0 % | 2026-08-18 11:21 | ✅ |
40 +
41 +## Licence / conformité
42 +
43 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
44 +
45 +## Historique
46 +
47 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
48 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
49 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
50 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
51 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
52 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
53 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
54 +
55 +Commits touchant `jobka/connectors/workland.py` :
56 +
57 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/autodesk.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/autodesk.md
7 +Rôle : Fiche connecteur — Autodesk (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Autodesk (`autodesk`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/autodesk.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Autodesk]()
20 +- **Page carrières** : https://autodesk.wd1.myworkdayjobs.com/Ext
21 +- **Secteurs** : TI, Logiciel
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Autodesk` |
33 +| `HOST` | `wd1` |
34 +| `SITE` | `Ext` |
35 +| `TENANT` | `autodesk` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **67 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 31 % |
50 +| `region` — Région | région administrative | 31 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 19 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 97 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 91 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 91 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 84 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 48 % |
63 +
64 +Exemple réel : *AI Builder, Principal Experience Designer* — ∅ · -based roles, we expect a starting base salary between $130,000 and $232,320 · parue le 2026-08-14.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 68 (dont **67 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 61/67 actives (91 %)
83 +- **GPS** : 32/67 actives (48 %)
84 +- **Mode** : 13/67 actives (19 %)
85 +- **Parution** : 67/67 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 67, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync autodesk` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='autodesk' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Autodesk » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/autodesk.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/aviyatech.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/aviyatech.md
7 +Rôle : Fiche connecteur — Aviya Aerospace Systems (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Aviya Aerospace Systems (`aviyatech`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/aviyatech.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Aviya Aerospace Systems]()
20 +- **Page carrières** : https://jobs.lever.co/aviyatech
21 +- **Secteurs** : Aéronautique
22 +- **Région** : Longueuil
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Aviya Aerospace Systems` |
33 +| `ORG` | `aviyatech` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Computer Engineer-Talent Pool Longueuil* — Québec · ∅ · parue le 2026-05-27.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/5 actives (0 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 5/5 actives (100 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync aviyatech` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='aviyatech' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Aviya Aerospace Systems » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/aviyatech.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/bardel_entertainment.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bardel_entertainment.md
7 +Rôle : Fiche connecteur — Bardel Entertainment (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Bardel Entertainment (`bardel_entertainment`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/bardel_entertainment.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Bardel Entertainment]()
20 +- **Page carrières** : https://apply.workable.com/bardel-entertainment
21 +- **Secteurs** : Animation
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Bardel Entertainment` |
33 +| `ORG` | `bardel-entertainment` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 33 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 33 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 33 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Artiste d’éclairage/ Lighting Artist (Featurette)* — Montréal · Échelle salariale : $ 1400 - 1700 $ CAD par semaine · parue le 2026-08-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/3 actives (33 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 0/3 actives (0 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bardel_entertainment` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bardel_entertainment' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Bardel Entertainment » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/bardel_entertainment.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/bayshore.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bayshore.md
7 +Rôle : Fiche connecteur — Bayshore HealthCare (employeur direct, ATS taleo)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Bayshore HealthCare (`bayshore`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`taleo`](ats-taleo.md) · Statut registre : actif · Connecteur : `jobka/connectors/bayshore.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Bayshore HealthCare](https://www.bayshore.ca)
20 +- **Page carrières** : https://bayshore.taleo.net/careersection/bs_ex/jobsearch.ftl?lang=fr
21 +- **Secteurs** : Santé, Soins à domicile
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-taleo.md`](ats-taleo.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Bayshore HealthCare` |
33 +| `HOST` | `bayshore` |
34 +| `LANG` | `fr` |
35 +| `SECTION` | `bs_ex` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **12 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 0 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Gestionnaire de programme - Program Manager* — Montréal · ∅ · parue le ∅.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_TALEO_DETAIL_LIMIT` | `120` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 12 (dont **12 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/12 actives (0 %)
83 +- **GPS** : 12/12 actives (100 %)
84 +- **Mode** : 0/12 actives (0 %)
85 +- **Parution** : 0/12 actives (0 %)
86 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 12, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 4
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bayshore` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bayshore' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Bayshore HealthCare » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/bayshore.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/bc2.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bc2.md
7 +Rôle : Fiche connecteur — Groupe BC2 (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Groupe BC2 (`bc2`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/bc2.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Groupe BC2]()
20 +- **Page carrières** : https://bc2.bamboohr.com/careers
21 +- **Secteurs** : Urbanisme, Conseil
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Groupe BC2` |
33 +| `ORG` | `bc2` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 50 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *DIRECTEUR(TRICE) DE PROJET \| URBANISME, DÉVELOPPEMENT IMMOBILIER* — Montréal · ∅ · parue le 2026-07-27.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/2 actives (0 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:14 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bc2` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bc2' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Groupe BC2 » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/bc2.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/bdc.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bdc.md
7 +Rôle : Fiche connecteur — BDC (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# BDC (`bdc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/bdc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [BDC]()
20 +- **Page carrières** : https://bdc.wd10.myworkdayjobs.com/bdc_careers
21 +- **Secteurs** : Finance
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `BDC` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `bdc_careers` |
35 +| `TENANT` | `bdc` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **16 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *SCRUM MASTER* — Montréal · ∅ · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 16 (dont **16 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/16 actives (0 %)
83 +- **GPS** : 16/16 actives (100 %)
84 +- **Mode** : 0/16 actives (0 %)
85 +- **Parution** : 16/16 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 16, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bdc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bdc' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez BDC » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/bdc.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/bell_textron.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bell_textron.md
7 +Rôle : Fiche connecteur — Bell Textron Canada (employeur direct, ATS taleo)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Bell Textron Canada (`bell_textron`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`taleo`](ats-taleo.md) · Statut registre : actif · Connecteur : `jobka/connectors/bell_textron.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Bell Textron Canada](https://www.bellflight.com)
20 +- **Page carrières** : https://textron.taleo.net/careersection/bell/jobsearch.ftl?lang=fr
21 +- **Secteurs** : Aéronautique, Fabrication
22 +- **Région** : Mirabel
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-taleo.md`](ats-taleo.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Bell Textron Canada` |
33 +| `HOST` | `textron` |
34 +| `LANG` | `fr` |
35 +| `SECTION` | `bell` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **15 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Analyste en conformité commerce internationale /Trade Compliance Associate Analyst* — Québec · ∅ · parue le 2026-08-04.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_TALEO_DETAIL_LIMIT` | `120` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 15 (dont **15 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/15 actives (0 %)
83 +- **GPS** : 15/15 actives (100 %)
84 +- **Mode** : 0/15 actives (0 %)
85 +- **Parution** : 15/15 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 15, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bell_textron` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bell_textron' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Bell Textron Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/bell_textron.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/beneva.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/beneva.md
7 +Rôle : Fiche connecteur — Beneva (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Beneva (`beneva`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/beneva.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Beneva](https://beneva.ca)
20 +- **Page carrières** : https://beneva.wd10.myworkdayjobs.com/BenevaSite_carriere
21 +- **Secteurs** : n/d
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Beneva` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `BenevaSite_carriere` |
35 +| `TENANT` | `beneva` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **48 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 2 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 2 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 2 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 67 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Agent service à la clientèle* — Québec · Salaire débutant à 25,34$/h + prime d'anglais! Plusieurs postes d · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 48 (dont **48 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/48 actives (2 %)
83 +- **GPS** : 48/48 actives (100 %)
84 +- **Mode** : 1/48 actives (2 %)
85 +- **Parution** : 48/48 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 48, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync beneva` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='beneva' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Beneva » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/beneva.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/bhvr.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bhvr.md
7 +Rôle : Fiche connecteur — Behaviour Interactif (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Behaviour Interactif (`bhvr`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/bhvr.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Behaviour Interactif]()
20 +- **Page carrières** : https://jobs.lever.co/bhvr
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Behaviour Interactif` |
33 +| `ORG` | `bhvr` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **39 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 3 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 3 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 74 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Articling Student - Bar of Quebec - Internship \| Stagiaire en droit - Barreau du Québec -…* — Montréal · · 250$ BEHappy expense reimbursement to buy wh · parue le 2026-08-04.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 39 (dont **39 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/39 actives (3 %)
76 +- **GPS** : 39/39 actives (100 %)
77 +- **Mode** : 39/39 actives (100 %)
78 +- **Parution** : 39/39 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 39, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bhvr` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bhvr' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Behaviour Interactif » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/bhvr.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/bigbang.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bigbang.md
7 +Rôle : Fiche connecteur — Big Bang (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Big Bang (`bigbang`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/bigbang.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Big Bang]()
20 +- **Page carrières** : https://bigbang.bamboohr.com/careers
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Big Bang` |
33 +| `ORG` | `bigbang` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 25 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 25 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 62 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Client Solutions Manager* — Montréal · CAD 38.46 per hour · parue le 2026-01-28.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 2/8 actives (25 %)
81 +- **GPS** : 8/8 actives (100 %)
82 +- **Mode** : 0/8 actives (0 %)
83 +- **Parution** : 8/8 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 8, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bigbang` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bigbang' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Big Bang » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/bigbang.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/biximontreal.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/biximontreal.md
7 +Rôle : Fiche connecteur — BIXI Montréal (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# BIXI Montréal (`biximontreal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/biximontreal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [BIXI Montréal]()
20 +- **Page carrières** : https://biximontreal.recruitee.com
21 +- **Secteurs** : Transport
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `BIXI Montréal` |
33 +| `ORG` | `biximontreal` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 50 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 0 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Technicien(ne) – Service réseau* — Montréal · • Un salaire de 28,00$ de l’heure ; · parue le 2026-06-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 2/2 actives (100 %)
76 +- **GPS** : 2/2 actives (100 %)
77 +- **Mode** : 2/2 actives (100 %)
78 +- **Parution** : 2/2 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 2, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync biximontreal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='biximontreal' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez BIXI Montréal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/biximontreal.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/bmo.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bmo.md
7 +Rôle : Fiche connecteur — BMO Groupe financier (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# BMO Groupe financier (`bmo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/bmo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [BMO Groupe financier]()
20 +- **Page carrières** : https://bmo.wd3.myworkdayjobs.com/External
21 +- **Secteurs** : Finance
22 +- **Région** : Montréal, Laval, Gatineau
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `BMO Groupe financier` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `External` |
35 +| `TENANT` | `bmo` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **107 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 80 % |
50 +| `region` — Région | région administrative | 93 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 17 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 93 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 84 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 84 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 96 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 79 % |
63 +
64 +Exemple réel : *Personal Banking Associate* — Montréal · 00 - $54,500 · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 107 (dont **107 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 90/107 actives (84 %)
83 +- **GPS** : 85/107 actives (79 %)
84 +- **Mode** : 18/107 actives (17 %)
85 +- **Parution** : 107/107 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:15 — trouvées 107, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bmo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bmo' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez BMO Groupe financier » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/bmo.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/bombardier.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/bombardier.md
7 +Rôle : Fiche connecteur — Bombardier (employeur direct, ATS successfactors)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Bombardier (`bombardier`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`successfactors`](ats-successfactors.md) · Statut registre : actif · Connecteur : `jobka/connectors/bombardier.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Bombardier](https://bombardier.com)
20 +- **Page carrières** : https://jobs.bombardier.com
21 +- **Secteurs** : Aéronautique, Ingénierie, Fabrication
22 +- **Région** : Dorval, Mirabel, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-successfactors.md`](ats-successfactors.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://jobs.bombardier.com` |
33 +| `EMPLOYER` | `Bombardier` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **843 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 51 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 80 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 45 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 6 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 82 % |
61 +
62 +Exemple réel : *Analyst Sr, Quality Assurance Product Safety Management* — Dorval · ∅ · parue le 2026-08-15.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SF_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 843 (dont **843 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/843 actives (0 %)
81 +- **GPS** : 691/843 actives (82 %)
82 +- **Mode** : 382/843 actives (45 %)
83 +- **Parution** : 843/843 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 843, +2, ~151, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync bombardier` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='bombardier' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Bombardier » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/bombardier.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/botpress.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/botpress.md
7 +Rôle : Fiche connecteur — Botpress (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Botpress (`botpress`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/botpress.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Botpress]()
20 +- **Page carrières** : https://apply.workable.com/botpress
21 +- **Secteurs** : TI, IA
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Botpress` |
33 +| `ORG` | `botpress` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 75 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Développeur(euse) croissance - GTM* — Québec · ∅ · parue le 2026-08-05.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/8 actives (0 %)
76 +- **GPS** : 8/8 actives (100 %)
77 +- **Mode** : 0/8 actives (0 %)
78 +- **Parution** : 8/8 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 10, +0, ~4, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync botpress` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='botpress' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Botpress » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/botpress.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/brandmomentum.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/brandmomentum.md
7 +Rôle : Fiche connecteur — Brand Momentum (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Brand Momentum (`brandmomentum`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/brandmomentum.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Brand Momentum]()
20 +- **Page carrières** : https://brandmomentum.breezy.hr
21 +- **Secteurs** : Marketing, Ventes
22 +- **Région** : Montréal, Laval, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Brand Momentum` |
33 +| `ORG` | `brandmomentum` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **27 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 67 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 70 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Ambassadeur(drice) de marque (Spécialiste en activation événementielle)* — Québec · Rémunération : Jusqu’à 22 $/heure · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 27 (dont **27 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 18/27 actives (67 %)
76 +- **GPS** : 27/27 actives (100 %)
77 +- **Mode** : 0/27 actives (0 %)
78 +- **Parution** : 27/27 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 27, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync brandmomentum` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='brandmomentum' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Brand Momentum » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/brandmomentum.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/broadsign.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/broadsign.md
7 +Rôle : Fiche connecteur — Broadsign (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Broadsign (`broadsign`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/broadsign.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Broadsign]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/broadsign
21 +- **Secteurs** : TI, Affichage
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `broadsign` |
33 +| `EMPLOYER` | `Broadsign` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Sales Director, Platform Sales - North America* — Montréal · ∅ · parue le 2026-08-11.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/4 actives (0 %)
76 +- **GPS** : 4/4 actives (100 %)
77 +- **Mode** : 4/4 actives (100 %)
78 +- **Parution** : 4/4 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 4, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync broadsign` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='broadsign' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Broadsign » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/broadsign.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/broccolini.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/broccolini.md
7 +Rôle : Fiche connecteur — Broccolini (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Broccolini (`broccolini`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/broccolini.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Broccolini]()
20 +- **Page carrières** : https://broccolini.bamboohr.com/careers
21 +- **Secteurs** : Construction, Immobilier
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Broccolini` |
33 +| `ORG` | `broccolini` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 96 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 4 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 96 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 87 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Concepteur(trice) en architecture \| Architectural Designer* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/23 actives (0 %)
81 +- **GPS** : 23/23 actives (100 %)
82 +- **Mode** : 1/23 actives (4 %)
83 +- **Parution** : 23/23 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 23, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync broccolini` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='broccolini' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Broccolini » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/broccolini.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/caaquebec.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/caaquebec.md
7 +Rôle : Fiche connecteur — CAA-Québec (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CAA-Québec (`caaquebec`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/caaquebec.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CAA-Québec](https://caaquebec.com)
20 +- **Page carrières** : https://caaquebec.wd3.myworkdayjobs.com/CarrieresCAA-Quebec
21 +- **Secteurs** : n/d
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `CAA-Québec` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `CarrieresCAA-Quebec` |
35 +| `TENANT` | `caaquebec` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **19 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 16 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 16 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 68 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Représentant(e) en assurance voyage (Certifié(e) AMF)* — Montréal · 96$/heure · parue le 2026-08-13.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 19 (dont **19 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 3/19 actives (16 %)
83 +- **GPS** : 19/19 actives (100 %)
84 +- **Mode** : 0/19 actives (0 %)
85 +- **Parution** : 19/19 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 19, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync caaquebec` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='caaquebec' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CAA-Québec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/caaquebec.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/cae.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cae.md
7 +Rôle : Fiche connecteur — CAE (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CAE (`cae`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/cae.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CAE](https://www.cae.com)
20 +- **Page carrières** : https://cae.wd3.myworkdayjobs.com/career
21 +- **Secteurs** : Aéronautique, Simulation, TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `CAE` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `career` |
35 +| `TENANT` | `cae` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **52 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 87 % |
50 +| `region` — Région | région administrative | 87 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 8 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 8 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 75 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 92 % |
63 +
64 +Exemple réel : *Director, Business Development, D&S Canada* — ∅ · $184,600 - $234,600 · parue le 2026-08-13.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 53 (dont **52 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 4/52 actives (8 %)
83 +- **GPS** : 48/52 actives (92 %)
84 +- **Mode** : 0/52 actives (0 %)
85 +- **Parution** : 52/52 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 52, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 18
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cae` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cae' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CAE » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/cae.py` :
111 +
112 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/canada_global.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/canada_global.md
7 +Rôle : Fiche connecteur — Canada Global Recruitment (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Canada Global Recruitment (`canada_global`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/canada_global.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Canada Global Recruitment]()
20 +- **Page carrières** : https://canada-global.breezy.hr
21 +- **Secteurs** : Placement
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Canada Global Recruitment` |
33 +| `ORG` | `canada-global` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 0 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
61 +
62 +Exemple réel : *General labor* — Montreal - QC · ∅ · parue le 2026-06-27.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 0/1 actives (0 %)
77 +- **Mode** : 0/1 actives (0 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync canada_global` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='canada_global' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Canada Global Recruitment » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/canada_global.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/canadiantirecorporation.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/canadiantirecorporation.md
7 +Rôle : Fiche connecteur — Canadian Tire (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Canadian Tire (`canadiantirecorporation`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/canadiantirecorporation.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Canadian Tire](https://canadiantire.ca)
20 +- **Page carrières** : https://canadiantirecorporation.wd3.myworkdayjobs.com/Enterprise_External_Careers_Site
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Canadian Tire` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Enterprise_External_Careers_Site` |
35 +| `TENANT` | `canadiantirecorporation` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 56 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 56 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 89 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Assistant Manager* — Lévis · Our typical hiring range is between $34,800 and $43,500 · parue le 2026-07-27.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 5/9 actives (56 %)
83 +- **GPS** : 9/9 actives (100 %)
84 +- **Mode** : 0/9 actives (0 %)
85 +- **Parution** : 9/9 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 9, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync canadiantirecorporation` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='canadiantirecorporation' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Canadian Tire » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/canadiantirecorporation.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/capreit.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/capreit.md
7 +Rôle : Fiche connecteur — CAPREIT (employeur direct, ATS icims)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CAPREIT (`capreit`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`icims`](ats-icims.md) · Statut registre : actif · Connecteur : `jobka/connectors/capreit.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CAPREIT](https://www.capreit.ca)
20 +- **Page carrières** : https://careers-capreit.icims.com/jobs/search?ss=1
21 +- **Secteurs** : Immobilier, Gestion immobilière
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-icims.md`](ats-icims.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `CAPREIT` |
33 +| `SUB` | `careers-capreit` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 90 % |
49 +| `address` — Adresse | adresse du lieu de travail | 100 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 10 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 60 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Operations Manager 1* — Montréal · ∅ · parue le 2026-07-29.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_ICIMS_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/10 actives (0 %)
81 +- **GPS** : 10/10 actives (100 %)
82 +- **Mode** : 0/10 actives (0 %)
83 +- **Parution** : 10/10 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 10, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync capreit` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='capreit' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CAPREIT » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/capreit.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/cascades.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cascades.md
7 +Rôle : Fiche connecteur — Cascades (employeur direct, ATS successfactors)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Cascades (`cascades`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`successfactors`](ats-successfactors.md) · Statut registre : actif · Connecteur : `jobka/connectors/cascades.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Cascades](https://www.cascades.com)
20 +- **Page carrières** : https://jobs.cascades.com
21 +- **Secteurs** : Pâtes et papiers, Emballage, Fabrication
22 +- **Région** : Kingsey Falls, Drummondville, Candiac
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-successfactors.md`](ats-successfactors.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://jobs.cascades.com` |
33 +| `EMPLOYER` | `Cascades` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **99 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 25 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 12 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 12 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 75 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 75 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 0 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 65 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 99 % |
61 +
62 +Exemple réel : *Électrotechnicien de nuit* — Granby · Salaire horaire de 43,59$/h incluant la prime de nuit de 3,00$, si tu as ta licence CÉ une… · parue le ∅.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SF_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 100 (dont **99 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 74/99 actives (75 %)
81 +- **GPS** : 98/99 actives (99 %)
82 +- **Mode** : 12/99 actives (12 %)
83 +- **Parution** : 0/99 actives (0 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 99, +1, ~0, -1
85 +- **Syncs enregistrés** (`sync_log`) : 4
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cascades` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cascades' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Cascades » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/cascades.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/cdpq.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cdpq.md
7 +Rôle : Fiche connecteur — CDPQ — Caisse de dépôt et placement du Québec (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CDPQ — Caisse de dépôt et placement du Québec (`cdpq`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/cdpq.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CDPQ — Caisse de dépôt et placement du Québec](https://cdpq.com)
20 +- **Page carrières** : https://cdpq.wd10.myworkdayjobs.com/CDPQ
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `CDPQ — Caisse de dépôt et placement du Québec` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `CDPQ` |
35 +| `TENANT` | `cdpq` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **27 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 85 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Premier(-ère) conseiller(-ère), Analytique et intelligence de sécurité* — Montréal · ∅ · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 27 (dont **27 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/27 actives (0 %)
83 +- **GPS** : 27/27 actives (100 %)
84 +- **Mode** : 0/27 actives (0 %)
85 +- **Parution** : 27/27 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 27, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cdpq` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cdpq' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CDPQ — Caisse de dépôt et placement du Québec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/cdpq.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/cfmontreal.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cfmontreal.md
7 +Rôle : Fiche connecteur — CF Montréal (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CF Montréal (`cfmontreal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/cfmontreal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CF Montréal]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/CFMontreal
21 +- **Secteurs** : Sport
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `CFMontreal` |
33 +| `EMPLOYER` | `CF Montréal` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 62 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Chef(e) de projets et production marketing - TEMPORAIRE / Marketing and Production Project…* — Montréal · ∅ · parue le 2026-08-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/8 actives (0 %)
81 +- **GPS** : 8/8 actives (100 %)
82 +- **Mode** : 0/8 actives (0 %)
83 +- **Parution** : 8/8 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 8, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cfmontreal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cfmontreal' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CF Montréal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/cfmontreal.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/charger_logistics_inc.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/charger_logistics_inc.md
7 +Rôle : Fiche connecteur — Charger Logistics (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Charger Logistics (`charger_logistics_inc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/charger_logistics_inc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Charger Logistics]()
20 +- **Page carrières** : https://apply.workable.com/charger-logistics-inc
21 +- **Secteurs** : Transport, Logistique
22 +- **Région** : Dorval
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Charger Logistics` |
33 +| `ORG` | `charger-logistics-inc` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Security Guard (Trucking Yard)* — Québec · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 1/1 actives (100 %)
77 +- **Mode** : 0/1 actives (0 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync charger_logistics_inc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='charger_logistics_inc' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Charger Logistics » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/charger_logistics_inc.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/churchdwight.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/churchdwight.md
7 +Rôle : Fiche connecteur — Church & Dwight Canada (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Church & Dwight Canada (`churchdwight`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/churchdwight.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Church & Dwight Canada](https://churchdwight.ca)
20 +- **Page carrières** : https://churchdwight.wd1.myworkdayjobs.com/chdcanadacareers
21 +- **Secteurs** : Production
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Church & Dwight Canada` |
33 +| `HOST` | `wd1` |
34 +| `SITE` | `chdcanadacareers` |
35 +| `TENANT` | `churchdwight` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 33 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Electromécanicien(ne)* — Montréal · ∅ · parue le 2026-08-12.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/6 actives (0 %)
83 +- **GPS** : 6/6 actives (100 %)
84 +- **Mode** : 0/6 actives (0 %)
85 +- **Parution** : 6/6 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 6, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync churchdwight` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='churchdwight' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Church & Dwight Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/churchdwight.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/cibc.md +116 −0
@@ -0,0 +1,116 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cibc.md
7 +Rôle : Fiche connecteur — Banque CIBC (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Banque CIBC (`cibc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/cibc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Banque CIBC]()
20 +- **Page carrières** : https://cibc.wd3.myworkdayjobs.com/search
21 +- **Secteurs** : Finance
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Banque CIBC` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `search` |
35 +| `TENANT` | `cibc` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **63 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 3 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 2 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 2 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *CIBC – Associate / Senior Analyst, Institutional Client Experience - Bilingual* — Montréal · policies for institutional investment accounts sizing from $50M to $10B · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 65 (dont **63 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/63 actives (2 %)
83 +- **GPS** : 63/63 actives (100 %)
84 +- **Mode** : 2/63 actives (3 %)
85 +- **Parution** : 63/63 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 63, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Erreurs relevées dans `sync_log` :
92 +
93 +| Erreur | Occurrences | Dernière fois |
94 +|---|---|---|
95 +| HTTPSConnectionPool(host='cibc.wd3.myworkdayjobs.com', port=443): Read timed out. (read ti… | 1 | 2026-08-17 21:23 |
96 +
97 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cibc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cibc' ORDER BY ts DESC LIMIT 5;"`
98 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
99 +
100 +## Licence / conformité
101 +
102 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Banque CIBC » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
103 +
104 +## Historique
105 +
106 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
107 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
108 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
109 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
110 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
111 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
112 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
113 +
114 +Commits touchant `jobka/connectors/cibc.py` :
115 +
116 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/cima2.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cima2.md
7 +Rôle : Fiche connecteur — CIMA+ (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CIMA+ (`cima2`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/cima2.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CIMA+]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/CIMA2
21 +- **Secteurs** : Ingénierie
22 +- **Région** : Montréal, Québec, Laval
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `CIMA2` |
33 +| `EMPLOYER` | `CIMA+` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **221 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 84 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 95 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Technicienne ou technicien, inspection de structures de télécommunications - Montréal ou L…* — Montréal · ∅ · parue le 2026-08-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 231 (dont **221 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/221 actives (0 %)
81 +- **GPS** : 221/221 actives (100 %)
82 +- **Mode** : 185/221 actives (84 %)
83 +- **Parution** : 221/221 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:19 — trouvées 221, +0, ~0, -6
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cima2` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cima2' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CIMA+ » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/cima2.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/circlek.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/circlek.md
7 +Rôle : Fiche connecteur — Couche-Tard / Circle K (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Couche-Tard / Circle K (`circlek`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/circlek.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Couche-Tard / Circle K]()
20 +- **Page carrières** : https://circlek.wd3.myworkdayjobs.com/CircleKStoreJobs
21 +- **Secteurs** : Commerce de détail
22 +- **Région** : Québec, Montréal, Drummondville
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Couche-Tard / Circle K` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `CircleKStoreJobs` |
35 +| `TENANT` | `circlek` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **1005 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 63 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 84 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 45 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 45 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 78 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 63 % |
63 +
64 +Exemple réel : *Préposé(e) au service à la clientèle de nuit -ACT* — Québec · Salaire (nuit) : 20,10$ /h (Incluant prime*) · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 1013 (dont **1005 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 449/1005 actives (45 %)
83 +- **GPS** : 634/1005 actives (63 %)
84 +- **Mode** : 2/1005 actives (0 %)
85 +- **Parution** : 1005/1005 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 1005, +0, ~0, -1
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync circlek` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='circlek' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Couche-Tard / Circle K » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/circlek.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/cirquedusoleil.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cirquedusoleil.md
7 +Rôle : Fiche connecteur — Cirque du Soleil (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Cirque du Soleil (`cirquedusoleil`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/cirquedusoleil.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Cirque du Soleil](https://www.cirquedusoleil.com)
20 +- **Page carrières** : https://jobs.lever.co/cirquedusoleil
21 +- **Secteurs** : Divertissement, Création
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Cirque du Soleil` |
33 +| `ORG` | `cirquedusoleil` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **22 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 86 % |
48 +| `region` — Région | région administrative | 86 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 91 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 82 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 86 % |
61 +
62 +Exemple réel : *Vice-président(e), Marketing – Spectacles internationaux et Amériques \| Vice President Ma…* — ∅ · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 22 (dont **22 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/22 actives (0 %)
76 +- **GPS** : 19/22 actives (86 %)
77 +- **Mode** : 22/22 actives (100 %)
78 +- **Parution** : 22/22 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 22, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cirquedusoleil` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cirquedusoleil' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Cirque du Soleil » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/cirquedusoleil.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/ciusss_est_montreal.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ciusss_est_montreal.md
7 +Rôle : Fiche connecteur — CIUSSS de l'Est-de-l'Île-de-Montréal (employeur direct, ATS taleo)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# CIUSSS de l'Est-de-l'Île-de-Montréal (`ciusss_est_montreal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`taleo`](ats-taleo.md) · Statut registre : actif · Connecteur : `jobka/connectors/ciusss_est_montreal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [CIUSSS de l'Est-de-l'Île-de-Montréal](https://ciusss-estmtl.gouv.qc.ca)
20 +- **Page carrières** : https://ciusssemtl.taleo.net/careersection/cemtl/jobsearch.ftl?lang=fr
21 +- **Secteurs** : Santé, Services sociaux, Secteur public
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-taleo.md`](ats-taleo.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `CIUSSS de l'Est-de-l'Île-de-Montréal` |
33 +| `HOST` | `ciusssemtl` |
34 +| `LANG` | `fr` |
35 +| `SECTION` | `cemtl` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 9 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Chef de service - aide à domicile - secteur Pointe-Aux-Trembles (Intérim)* — Montréal · ∅ · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_TALEO_DETAIL_LIMIT` | `120` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 23 (dont **23 actives**, 1 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/23 actives (0 %)
83 +- **GPS** : 23/23 actives (100 %)
84 +- **Mode** : 0/23 actives (0 %)
85 +- **Parution** : 23/23 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 23, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync ciusss_est_montreal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ciusss_est_montreal' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez CIUSSS de l'Est-de-l'Île-de-Montréal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/ciusss_est_montreal.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/cogeco.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cogeco.md
7 +Rôle : Fiche connecteur — Cogeco (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Cogeco (`cogeco`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/cogeco.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Cogeco]()
20 +- **Page carrières** : https://cogeco.wd3.myworkdayjobs.com/Cogeco_Careers
21 +- **Secteurs** : Télécoms
22 +- **Région** : Montréal, Trois-Rivières
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Cogeco` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Cogeco_Careers` |
35 +| `TENANT` | `cogeco` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **48 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 94 % |
50 +| `region` — Région | région administrative | 52 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 4 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 17 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 17 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 40 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 56 % |
63 +
64 +Exemple réel : *Technician, Customer and Network Facing* — Grasonville · 30– $36 · parue le 2026-08-12.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 48 (dont **48 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 8/48 actives (17 %)
83 +- **GPS** : 27/48 actives (56 %)
84 +- **Mode** : 2/48 actives (4 %)
85 +- **Parution** : 48/48 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 48, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cogeco` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cogeco' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Cogeco » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/cogeco.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/cohere.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cohere.md
7 +Rôle : Fiche connecteur — Cohere (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Cohere (`cohere`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/cohere.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Cohere]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/cohere
21 +- **Secteurs** : TI, IA
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Cohere` |
33 +| `ORG` | `cohere` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **46 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 17 % |
48 +| `region` — Région | région administrative | 4 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 17 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 17 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 37 % |
61 +
62 +Exemple réel : *Member of Technical Staff, Multilingual* — ∅ · - For candidates in the US, the Compensation Range is: $110,000 - $370,000 [USD] · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 46 (dont **46 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 8/46 actives (17 %)
76 +- **GPS** : 17/46 actives (37 %)
77 +- **Mode** : 46/46 actives (100 %)
78 +- **Parution** : 46/46 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 46, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cohere` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cohere' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Cohere » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/cohere.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/cordonbleu.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cordonbleu.md
7 +Rôle : Fiche connecteur — Aliments Ouimet-Cordon Bleu inc. (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Aliments Ouimet-Cordon Bleu inc. (`cordonbleu`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/cordonbleu.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Aliments Ouimet-Cordon Bleu inc.](https://clarkcordonbleu.ca)
20 +- **Page carrières** : https://cordonbleu.bamboohr.com/careers
21 +- **Secteurs** : Production
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Aliments Ouimet-Cordon Bleu inc.` |
33 +| `ORG` | `cordonbleu` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 50 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Électromécanicien Licence C - Jusqu'à 45$/hr* — Montréal · 40-45$/hr selon expérience · parue le 2025-05-08.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 1/2 actives (50 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cordonbleu` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cordonbleu' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Aliments Ouimet-Cordon Bleu inc. » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/cordonbleu.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/cssdm.md +106 −0
@@ -0,0 +1,106 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/cssdm.md
7 +Rôle : Fiche connecteur — Centre de services scolaire de Montréal (employeur direct, ATS workland)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Centre de services scolaire de Montréal (`cssdm`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workland`](ats-workland.md) · Statut registre : actif · Connecteur : `jobka/connectors/cssdm.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Centre de services scolaire de Montréal](https://www.cssdm.gouv.qc.ca)
20 +- **Page carrières** : https://www.cssdm.gouv.qc.ca/travailler-cssdm/offres-emploi/
21 +- **Secteurs** : Éducation, Secteur public
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workland.md`](ats-workland.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `DEFAULT_CITY` | `Montréal` |
33 +| `EMPLOYER` | `Centre de services scolaire de Montréal` |
34 +| `LIST_URL` | `https://www.cssdm.gouv.qc.ca/travailler-cssdm/offres-emploi/` |
35 +- **Throttle** : 1.0 s entre requêtes.
36 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
37 +
38 +## Champs → schéma
39 +
40 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
41 +
42 +| Champ (`jobs.*`) | Rôle | Complétude |
43 +|---|---|---|
44 +| `title` — Titre | titre du poste | 100 % |
45 +| `employer` — Employeur | nom de l'entreprise | 100 % |
46 +| `url` — URL | lien direct vers l'offre originale | 100 % |
47 +| `description` — Description | texte complet (HTML nettoyé) | 0 % |
48 +| `city` — Ville | municipalité normalisée | 100 % |
49 +| `region` — Région | région administrative | 100 % |
50 +| `address` — Adresse | adresse du lieu de travail | 0 % |
51 +| `postal_code` — Code postal | code postal si publié | 0 % |
52 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
53 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
54 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
55 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
56 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
57 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
58 +| `date_posted` — Date de parution | ISO 8601 | 0 % |
59 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
60 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 74 % |
61 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
62 +
63 +Exemple réel : *Enseignantes et enseignants au préscolaire et primaire* — Montréal · ∅ · parue le ∅.
64 +
65 +## Fréquence & budgets
66 +
67 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
68 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
69 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
70 +
71 +## Volumétrie & complétude live
72 +
73 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
74 +
75 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
76 +- **Salaire** : 0/23 actives (0 %)
77 +- **GPS** : 0/23 actives (0 %)
78 +- **Mode** : 0/23 actives (0 %)
79 +- **Parution** : 0/23 actives (0 %)
80 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 23, +0, ~23, -0
81 +- **Syncs enregistrés** (`sync_log`) : 6
82 +
83 +## Erreurs & dépannage
84 +
85 +Aucune erreur dans `sync_log` pour cette source.
86 +
87 +- Rejouer un sync isolé : `.venv/bin/python run.py sync cssdm` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='cssdm' ORDER BY ts DESC LIMIT 5;"`
88 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
89 +
90 +## Licence / conformité
91 +
92 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Centre de services scolaire de Montréal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
93 +
94 +## Historique
95 +
96 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
97 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
98 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
99 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
100 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
101 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
102 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
103 +
104 +Commits touchant `jobka/connectors/cssdm.py` :
105 +
106 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/dcbel.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/dcbel.md
7 +Rôle : Fiche connecteur — dcbel (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# dcbel (`dcbel`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/dcbel.py`
16 +
17 +## Description
18 +
19 +- **Site** : [dcbel]()
20 +- **Page carrières** : https://dcbel.bamboohr.com/careers
21 +- **Secteurs** : Énergie, TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `dcbel` |
33 +| `ORG` | `dcbel` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **20 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 90 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 60 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Production supervisor* — Montréal · ∅ · parue le 2026-08-05.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 20 (dont **20 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/20 actives (0 %)
81 +- **GPS** : 20/20 actives (100 %)
82 +- **Mode** : 0/20 actives (0 %)
83 +- **Parution** : 20/20 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 20, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync dcbel` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='dcbel' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez dcbel » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/dcbel.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/depot-direct.md +67 −0
@@ -0,0 +1,67 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/depot-direct.md
7 +Rôle : Fiche du canal de dépôt direct employeurs
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Dépôt direct employeurs (`depot-direct`)
14 +
15 +**Canal de dépôt** : pas un connecteur de collecte — les employeurs déposent eux-mêmes leurs offres.
16 +
17 +## Description
18 +
19 +- Formulaire public `/employeurs` du site ; endpoint `POST /api/employeurs/offres` (`jobka/web.py`).
20 +- L'offre est stockée **INACTIVE** (`active=0`, `details.moderation = en_attente`) jusqu'à modération manuelle.
21 +- Validations : courriel de contact, URL `http(s)://`, type d'emploi et mode de travail dans les vocabulaires fermés.
22 +- **Pot de miel anti-robots** : champ caché `website` — s'il est rempli, l'offre est silencieusement ignorée.
23 +
24 +## Accès
25 +
26 +- **Endpoint** : `POST /api/employeurs/offres` (JSON).
27 +- **Backend** : aucun fetch sortant — données poussées par l'employeur.
28 +
29 +## Champs → schéma
30 +
31 +*Aucune offre active en base pour cette source.*
32 +
33 +## Fréquence & budgets
34 +
35 +- Au fil de l'eau (soumissions) ; publication après modération manuelle.
36 +
37 +## Volumétrie & complétude live
38 +
39 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
40 +
41 +- **Offres en base** : 0 (dont **0 actives**, 0 masquées comme doublons `dup_of`)
42 +- **Salaire** : 0/0 actives (—)
43 +- **GPS** : 0/0 actives (—)
44 +- **Mode** : 0/0 actives (—)
45 +- **Parution** : 0/0 actives (—)
46 +- **Syncs enregistrés** (`sync_log`) : 0
47 +
48 +Soumissions en attente de modération : **0**.
49 +
50 +## Erreurs & dépannage
51 +
52 +- `422` sur le formulaire = validation (courriel, URL, vocabulaires). Les soumissions piégées par le pot de miel ne sont pas stockées.
53 +- Lister les offres en attente : `sqlite3 data/jobka.db "SELECT uid, employer, title FROM jobs WHERE source='depot-direct' AND active=0;"`
54 +
55 +## Licence / conformité
56 +
57 +Offres **soumises volontairement par les employeurs** via le formulaire public `/employeurs` (`POST /api/employeurs/offres`). Stockées INACTIVES en attente de **modération manuelle** ; pot de miel anti-robots ; seul un courriel d'affaires de contact (fourni volontairement) est conservé dans `details.contact_email`. Aucune donnée personnelle de candidat.
58 +
59 +## Historique
60 +
61 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
62 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
63 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
64 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
65 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
66 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
67 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
added docs/connecteurs/desjardins.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/desjardins.md
7 +Rôle : Fiche connecteur — Mouvement Desjardins (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mouvement Desjardins (`desjardins`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/desjardins.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mouvement Desjardins](https://www.desjardins.com)
20 +- **Page carrières** : https://desjardins.wd10.myworkdayjobs.com/Desjardins
21 +- **Secteurs** : Finance, Assurance, TI
22 +- **Région** : Lévis / province
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mouvement Desjardins` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `Desjardins` |
35 +| `TENANT` | `desjardins` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **245 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 94 % |
50 +| `region` — Région | région administrative | 73 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 20 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 62 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 94 % |
63 +
64 +Exemple réel : *Sector Vulnerability Management Lead* — Lévis · ∅ · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 257 (dont **245 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/245 actives (0 %)
83 +- **GPS** : 231/245 actives (94 %)
84 +- **Mode** : 48/245 actives (20 %)
85 +- **Parution** : 245/245 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 245, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 19
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync desjardins` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='desjardins' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mouvement Desjardins » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/desjardins.py` :
111 +
112 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/devimco.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/devimco.md
7 +Rôle : Fiche connecteur — Devimco Appartements (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Devimco Appartements (`devimco`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/devimco.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Devimco Appartements](https://devimco.com)
20 +- **Page carrières** : https://devimco.bamboohr.com/careers
21 +- **Secteurs** : Immobilier
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Devimco Appartements` |
33 +| `ORG` | `devimco` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **7 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 14 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 14 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 86 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 71 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Superviseur(e) à la maintenance* — Québec · Salaire: 75 000$ par année; · parue le 2026-04-20.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 7 (dont **7 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 1/7 actives (14 %)
81 +- **GPS** : 7/7 actives (100 %)
82 +- **Mode** : 0/7 actives (0 %)
83 +- **Parution** : 7/7 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 7, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync devimco` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='devimco' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Devimco Appartements » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/devimco.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/dilitrust.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/dilitrust.md
7 +Rôle : Fiche connecteur — DiliTrust (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# DiliTrust (`dilitrust`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/dilitrust.py`
16 +
17 +## Description
18 +
19 +- **Site** : [DiliTrust]()
20 +- **Page carrières** : https://jobs.lever.co/dilitrust
21 +- **Secteurs** : TI, Juridique
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `DiliTrust` |
33 +| `ORG` | `dilitrust` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 67 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Account Manager* — Montréal · ∅ · parue le 2026-06-04.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/3 actives (0 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 3/3 actives (100 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync dilitrust` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='dilitrust' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez DiliTrust » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/dilitrust.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/distro.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/distro.md
7 +Rôle : Fiche connecteur — Distro (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Distro (`distro`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/distro.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Distro]()
20 +- **Page carrières** : https://jobs.lever.co/distro
21 +- **Secteurs** : Ventes, TI
22 +- **Région** : Montréal, Westmount
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Distro` |
33 +| `ORG` | `distro` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Conversion Consultant* — Québec · ∅ · parue le 2026-06-08.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 5/5 actives (100 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 5/5 actives (100 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync distro` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='distro' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Distro » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/distro.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/domtar.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/domtar.md
7 +Rôle : Fiche connecteur — Domtar (employeur direct, ATS successfactors)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Domtar (`domtar`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`successfactors`](ats-successfactors.md) · Statut registre : actif · Connecteur : `jobka/connectors/domtar.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Domtar](https://www.domtar.com)
20 +- **Page carrières** : https://jobs.domtar.com
21 +- **Secteurs** : Pâtes et papiers, Foresterie, Fabrication
22 +- **Région** : Montréal, Windsor, Lachine
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-successfactors.md`](ats-successfactors.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://jobs.domtar.com` |
33 +| `EMPLOYER` | `Domtar` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **107 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 93 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 21 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 99 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 1 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 0 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 92 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 99 % |
61 +
62 +Exemple réel : *Sales Manager, Quebec Region* — Lachine · ∅ · parue le ∅.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SF_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 107 (dont **107 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/107 actives (0 %)
81 +- **GPS** : 106/107 actives (99 %)
82 +- **Mode** : 0/107 actives (0 %)
83 +- **Parution** : 0/107 actives (0 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 107, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync domtar` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='domtar' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Domtar » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/domtar.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/dulcedo.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/dulcedo.md
7 +Rôle : Fiche connecteur — Dulcedo Management (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Dulcedo Management (`dulcedo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/dulcedo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Dulcedo Management]()
20 +- **Page carrières** : https://jobs.lever.co/dulcedo
21 +- **Secteurs** : Mode, Gestion d'artistes
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Dulcedo Management` |
33 +| `ORG` | `dulcedo` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 50 % |
48 +| `region` — Région | région administrative | 50 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 50 % |
61 +
62 +Exemple réel : *Account Manager - Influencer* — ∅ · ∅ · parue le 2026-05-22.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/2 actives (50 %)
76 +- **GPS** : 1/2 actives (50 %)
77 +- **Mode** : 2/2 actives (100 %)
78 +- **Parution** : 2/2 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 2, +0, ~0, -1
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync dulcedo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='dulcedo' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Dulcedo Management » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/dulcedo.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/edf_renouvelables.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/edf_renouvelables.md
7 +Rôle : Fiche connecteur — EDF Renouvelables Canada (employeur direct, ATS icims)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EDF Renouvelables Canada (`edf_renouvelables`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`icims`](ats-icims.md) · Statut registre : actif · Connecteur : `jobka/connectors/edf_renouvelables.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EDF Renouvelables Canada](https://www.edf-renouvelables.ca)
20 +- **Page carrières** : https://cafrench-edf-re.icims.com/jobs/search?ss=1
21 +- **Secteurs** : Énergie, Ingénierie
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-icims.md`](ats-icims.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EDF Renouvelables Canada` |
33 +| `SUB` | `cafrench-edf-re` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 44 % |
49 +| `address` — Adresse | adresse du lieu de travail | 100 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 67 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 11 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 67 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 67 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 67 % |
61 +
62 +Exemple réel : *Ingénieur.e électrique sénior [Hybride]* — Montréal · : La fourchette salariale complète pour ce poste est entre $97,600 - $162,700 par an, et l… · parue le 2026-06-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_ICIMS_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 6/9 actives (67 %)
81 +- **GPS** : 6/9 actives (67 %)
82 +- **Mode** : 6/9 actives (67 %)
83 +- **Parution** : 9/9 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 9, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync edf_renouvelables` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='edf_renouvelables' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EDF Renouvelables Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/edf_renouvelables.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/emcocorporation.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/emcocorporation.md
7 +Rôle : Fiche connecteur — EMCO (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EMCO (`emcocorporation`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/emcocorporation.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EMCO]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/EMCOCorporation
21 +- **Secteurs** : Distribution, Construction
22 +- **Région** : Montréal, Québec, Laval
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `EMCOCorporation` |
33 +| `EMPLOYER` | `EMCO` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **67 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 22 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 30 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 30 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 93 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Gestionnaire Junior en Distribution / Strategic Development Trainee* — Montréal · Échelle salariale : 52 500 $ plus participation aux bénéfices · parue le 2026-08-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 67 (dont **67 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 20/67 actives (30 %)
81 +- **GPS** : 67/67 actives (100 %)
82 +- **Mode** : 15/67 actives (22 %)
83 +- **Parution** : 67/67 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 67, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync emcocorporation` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='emcocorporation' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EMCO » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/emcocorporation.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/eminent_valet.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/eminent_valet.md
7 +Rôle : Fiche connecteur — Eminent Valet (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Eminent Valet (`eminent_valet`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/eminent_valet.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Eminent Valet]()
20 +- **Page carrières** : https://apply.workable.com/eminent-valet
21 +- **Secteurs** : Services
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Eminent Valet` |
33 +| `ORG` | `eminent-valet` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 89 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Valet & Butler \| Voiturier et Majordome (On-call, Sur appel)* — Montréal · Rémunération compétitive : 18 $ de l’heure+ pourboires selon la perform · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 9/9 actives (100 %)
76 +- **GPS** : 9/9 actives (100 %)
77 +- **Mode** : 0/9 actives (0 %)
78 +- **Parution** : 9/9 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 9, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync eminent_valet` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='eminent_valet' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Eminent Valet » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/eminent_valet.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/eosaircraftinc.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/eosaircraftinc.md
7 +Rôle : Fiche connecteur — EOS Aircraft (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EOS Aircraft (`eosaircraftinc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/eosaircraftinc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EOS Aircraft]()
20 +- **Page carrières** : https://eosaircraftinc.bamboohr.com/careers
21 +- **Secteurs** : Aéronautique
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EOS Aircraft` |
33 +| `ORG` | `eosaircraftinc` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 75 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 75 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 75 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Ingénieur principal – Systèmes de gestion de batterie (BMS)/ Principal Engineer – Battery …* — Montréal · ∅ · parue le 2026-06-09.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/4 actives (0 %)
81 +- **GPS** : 4/4 actives (100 %)
82 +- **Mode** : 3/4 actives (75 %)
83 +- **Parution** : 4/4 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 4, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync eosaircraftinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='eosaircraftinc' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EOS Aircraft » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/eosaircraftinc.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/eq3_ltd.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/eq3_ltd.md
7 +Rôle : Fiche connecteur — EQ3 (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EQ3 (`eq3_ltd`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/eq3_ltd.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EQ3]()
20 +- **Page carrières** : https://eq3-ltd.breezy.hr
21 +- **Secteurs** : Commerce de détail, Meuble
22 +- **Région** : Brossard, Laval, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EQ3` |
33 +| `ORG` | `eq3-ltd` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 60 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 60 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Consultant(e) en design - À temps plein* — Brossard · tant(e)s en design à temps plein gagnent généralement entre 65 000 $ et 75 000 $ par année… · parue le 2026-08-13.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 6/10 actives (60 %)
76 +- **GPS** : 10/10 actives (100 %)
77 +- **Mode** : 0/10 actives (0 %)
78 +- **Parution** : 10/10 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 10, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync eq3_ltd` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='eq3_ltd' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EQ3 » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/eq3_ltd.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/eqbank.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/eqbank.md
7 +Rôle : Fiche connecteur — EQ Bank (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EQ Bank (`eqbank`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/eqbank.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EQ Bank]()
20 +- **Page carrières** : https://jobs.lever.co/eqbank
21 +- **Secteurs** : Finance
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EQ Bank` |
33 +| `ORG` | `eqbank` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 50 % |
48 +| `region` — Région | région administrative | 50 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 17 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 17 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 83 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 50 % |
61 +
62 +Exemple réel : *Directeur Régional, Origination/Regional Director, Origination* — Montréal · r à bien de grandes transactions de financement immobilier (20 M$ et plus) avec des client… · parue le 2026-04-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/6 actives (17 %)
76 +- **GPS** : 3/6 actives (50 %)
77 +- **Mode** : 6/6 actives (100 %)
78 +- **Parution** : 6/6 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:21 — trouvées 6, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync eqbank` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='eqbank' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EQ Bank » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/eqbank.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/espresso_jobs.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/espresso_jobs.md
7 +Rôle : Fiche connecteur — portail agrégateur Espresso-Jobs
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Espresso-Jobs (`espresso_jobs`) — portail agrégateur
14 +
15 +**Portail agrégateur** (`dedup.AGGREGATORS`) : source complémentaire, moins autoritaire qu'une page carrière. En cas de doublon avec une offre directe, **l'offre directe gagne la canonique** et la copie portail est masquée (`dup_of`). Ces offres ne portent pas le badge « Offre directe ».
16 +
17 +## Description
18 +
19 +- **Portail** : [Espresso-Jobs](https://www.espresso-jobs.com)
20 +- **Secteurs** : Portail, TI, Créatif
21 +
22 +> Portail spécialisé Espresso-Jobs (espresso-jobs.com — TI et créatif QC).
23 +>
24 +> - liste : pages /emploi?page_no=N — chaque page embarque un JSON-LD
25 +> schema.org/ItemList (URL + titre de ~21 offres) ;
26 +> - détail : chaque page offre embarque un JSON-LD schema.org/JobPosting
27 +> (employeur, description, lieu, salaire) — cache BD + budget.
28 +
29 +## Accès
30 +
31 +- **Endpoint** (`BASE`) : `https://www.espresso-jobs.com`
32 +- **Pagination** : par numéro de page
33 +- **Backend** : GET direct `requests` (throttlé, UA `JobKaBot/1.0`)
34 +- **Throttle** : 1.0 s entre requêtes.
35 +
36 +## Champs → schéma
37 +
38 +Complétude mesurée sur les **294 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
39 +
40 +| Champ (`jobs.*`) | Rôle | Complétude |
41 +|---|---|---|
42 +| `title` — Titre | titre du poste | 100 % |
43 +| `employer` — Employeur | nom de l'entreprise | 100 % |
44 +| `url` — URL | lien direct vers l'offre originale | 100 % |
45 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
46 +| `city` — Ville | municipalité normalisée | 99 % |
47 +| `region` — Région | région administrative | 99 % |
48 +| `address` — Adresse | adresse du lieu de travail | 100 % |
49 +| `postal_code` — Code postal | code postal si publié | 1 % |
50 +| `work_mode` — Mode | presentiel / hybride / teletravail | 13 % |
51 +| `employment_type` — Type | temps_plein / temps_partiel / … | 34 % |
52 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 22 % |
53 +| `salary_label` — Libellé salaire | texte salarial original | 2 % |
54 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
55 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
56 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
57 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
58 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 76 % |
59 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
60 +
61 +Exemple réel : *Gestionnaire de Comptes Clés Chirurgie, Québec* — Montréal · Fourchette salariale : 94,000$ à 162,150$ CAD · parue le 2026-08-15.
62 +
63 +## Fréquence & budgets
64 +
65 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
66 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
67 +- **Budgets / plafonds (variables d'environnement)** :
68 +
69 +| Variable | Défaut |
70 +|---|---|
71 +| `JOBKA_ESPRESSO_PAGES` | `15` |
72 +| `JOBKA_ESPRESSO_DETAIL_LIMIT` | `100` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 294 (dont **294 actives**, 7 masquées comme doublons `dup_of`)
80 +- **Salaire** : 65/294 actives (22 %)
81 +- **GPS** : 0/294 actives (0 %)
82 +- **Mode** : 39/294 actives (13 %)
83 +- **Parution** : 294/294 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 294, +100, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync espresso_jobs` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='espresso_jobs' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +Lecture du **JSON-LD schema.org** (ItemList + JobPosting) publié par les pages publiques d'Espresso-Jobs. Lien vers l'offre originale sur le portail. robots.txt respecté ; budgets de visites par sync. Aucune donnée personnelle de candidat collectée.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/espresso_jobs.py` :
109 +
110 +- `f6e7571` 2026-08-18 Portails agrégateurs : Guichet-Emplois, Jobillico, Espresso-Jobs — l offre directe gagne toujours la canonique
added docs/connecteurs/evlo.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/evlo.md
7 +Rôle : Fiche connecteur — EVLO (Hydro-Québec) (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EVLO (Hydro-Québec) (`evlo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/evlo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EVLO (Hydro-Québec)]()
20 +- **Page carrières** : https://evlo.bamboohr.com/careers
21 +- **Secteurs** : Énergie
22 +- **Région** : Varennes
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EVLO (Hydro-Québec)` |
33 +| `ORG` | `evlo` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Ingénieur électrique senior - Conception et intégration de systèmes de stockage d’énergie* — Québec · ∅ · parue le 2026-05-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/2 actives (0 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync evlo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='evlo' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EVLO (Hydro-Québec) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/evlo.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/evolving_web.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/evolving_web.md
7 +Rôle : Fiche connecteur — Evolving Web (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Evolving Web (`evolving_web`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/evolving_web.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Evolving Web]()
20 +- **Page carrières** : https://apply.workable.com/evolving-web
21 +- **Secteurs** : TI, Web
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Evolving Web` |
33 +| `ORG` | `evolving-web` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **14 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 14 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 93 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Technical Content and Proposal Writer* — Montréal · ∅ · parue le 2026-08-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 14 (dont **14 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/14 actives (0 %)
76 +- **GPS** : 14/14 actives (100 %)
77 +- **Mode** : 2/14 actives (14 %)
78 +- **Parution** : 14/14 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 14, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync evolving_web` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='evolving_web' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Evolving Web » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/evolving_web.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/exfo.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/exfo.md
7 +Rôle : Fiche connecteur — EXFO (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# EXFO (`exfo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/exfo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [EXFO]()
20 +- **Page carrières** : https://exfo.wd10.myworkdayjobs.com/exfo_careers
21 +- **Secteurs** : TI, Télécommunications
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `EXFO` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `exfo_careers` |
35 +| `TENANT` | `exfo` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **27 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 56 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Specialiste controle des offres* — Québec · ∅ · parue le 2026-08-16.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 27 (dont **27 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/27 actives (0 %)
83 +- **GPS** : 27/27 actives (100 %)
84 +- **Mode** : 15/27 actives (56 %)
85 +- **Parution** : 27/27 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 27, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync exfo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='exfo' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez EXFO » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/exfo.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/explorance.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/explorance.md
7 +Rôle : Fiche connecteur — Explorance (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Explorance (`explorance`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/explorance.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Explorance]()
20 +- **Page carrières** : https://explorance.bamboohr.com/careers
21 +- **Secteurs** : TI, SaaS
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Explorance` |
33 +| `ORG` | `explorance` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **18 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 78 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordonnateur(trice) des services de bureau et de la réception / Office Services & Recepti…* — Montréal · ∅ · parue le 2026-08-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 18 (dont **18 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/18 actives (0 %)
81 +- **GPS** : 18/18 actives (100 %)
82 +- **Mode** : 0/18 actives (0 %)
83 +- **Parution** : 18/18 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 18, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync explorance` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='explorance' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Explorance » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/explorance.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/fenetresconcept.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/fenetresconcept.md
7 +Rôle : Fiche connecteur — Fenêtres Concept (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Fenêtres Concept (`fenetresconcept`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/fenetresconcept.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Fenêtres Concept](https://fenetresconcept.com)
20 +- **Page carrières** : https://fenetresconcept.bamboohr.com/careers
21 +- **Secteurs** : Production
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Fenêtres Concept` |
33 +| `ORG` | `fenetresconcept` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Commis à la réception de marchandise* — Québec · à partir de 21,30$ selon votre expérience · parue le 2026-08-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 2/2 actives (100 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync fenetresconcept` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='fenetresconcept' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Fenêtres Concept » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/fenetresconcept.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/flare.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/flare.md
7 +Rôle : Fiche connecteur — Flare (cybersécurité) (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Flare (cybersécurité) (`flare`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/flare.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Flare (cybersécurité)]()
20 +- **Page carrières** : https://flare.bamboohr.com/careers
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Flare (cybersécurité)` |
33 +| `ORG` | `flare` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 50 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Chef·effe d'équipe en développement logiciel, Plateforme Agentique / Software Development …* — Montréal · 130 000$ - 175 000$ CAD · parue le 2026-06-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 1/2 actives (50 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync flare` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='flare' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Flare (cybersécurité) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/flare.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/flinks.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/flinks.md
7 +Rôle : Fiche connecteur — Flinks (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Flinks (`flinks`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/flinks.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Flinks]()
20 +- **Page carrières** : https://apply.workable.com/flinks
21 +- **Secteurs** : TI, Fintech
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Flinks` |
33 +| `ORG` | `flinks` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 67 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 67 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Senior Full-Stack Developer* — Montréal · , of senior (IC4) level, the compensation range is between $120,000 to $160,000 CAD annual… · parue le 2026-06-29.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 3/3 actives (100 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 3/3 actives (100 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync flinks` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='flinks' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Flinks » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/flinks.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/fondsftq.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/fondsftq.md
7 +Rôle : Fiche connecteur — Fonds de solidarité FTQ (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Fonds de solidarité FTQ (`fondsftq`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/fondsftq.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Fonds de solidarité FTQ](https://fondsftq.com)
20 +- **Page carrières** : https://fondsftq.wd10.myworkdayjobs.com/sitecarriere_externe
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Fonds de solidarité FTQ` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `sitecarriere_externe` |
35 +| `TENANT` | `fondsftq` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Expert(e) sénior(e) en gestion des identités et des accès (GIA/IAM)* — Montréal · ∅ · parue le 2026-08-14.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/10 actives (0 %)
83 +- **GPS** : 10/10 actives (100 %)
84 +- **Mode** : 10/10 actives (100 %)
85 +- **Parution** : 10/10 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 10, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync fondsftq` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='fondsftq' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Fonds de solidarité FTQ » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/fondsftq.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/framestore.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/framestore.md
7 +Rôle : Fiche connecteur — Framestore (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Framestore (`framestore`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/framestore.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Framestore]()
20 +- **Page carrières** : https://framestore.recruitee.com
21 +- **Secteurs** : Effets visuels, Création
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Framestore` |
33 +| `ORG` | `framestore` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 22 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 22 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Lighting TD* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/9 actives (0 %)
76 +- **GPS** : 9/9 actives (100 %)
77 +- **Mode** : 9/9 actives (100 %)
78 +- **Parution** : 9/9 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 9, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync framestore` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='framestore' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Framestore » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/framestore.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/fuse.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/fuse.md
7 +Rôle : Fiche connecteur — Fuse Energy (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Fuse Energy (`fuse`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/fuse.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Fuse Energy]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/Fuse
21 +- **Secteurs** : Énergie, TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Fuse Energy` |
33 +| `ORG` | `Fuse` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 67 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Internship - Montreal* — Montréal · ∅ · parue le 2025-05-26.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/3 actives (0 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 0/3 actives (0 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync fuse` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='fuse' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Fuse Energy » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/fuse.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/gameloft.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gameloft.md
7 +Rôle : Fiche connecteur — Gameloft (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Gameloft (`gameloft`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/gameloft.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Gameloft](https://www.gameloft.com)
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/gameloft
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `gameloft` |
33 +| `EMPLOYER` | `Gameloft` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **15 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 73 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 73 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *[Dungeons & Dragons PC-Console] Concepteur Narratif Senior - Senior Narrative Designer* — Montréal · ∅ · parue le 2026-08-11.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 15 (dont **15 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/15 actives (0 %)
81 +- **GPS** : 15/15 actives (100 %)
82 +- **Mode** : 11/15 actives (73 %)
83 +- **Parution** : 15/15 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 15, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gameloft` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gameloft' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Gameloft » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/gameloft.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/gearboxquebec.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gearboxquebec.md
7 +Rôle : Fiche connecteur — Gearbox Studio Québec (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Gearbox Studio Québec (`gearboxquebec`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/gearboxquebec.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Gearbox Studio Québec]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/gearboxquebec
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `gearboxquebec` |
33 +| `EMPLOYER` | `Gearbox Studio Québec` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Directeur·rice du design / Design Director* — Montréal · ∅ · parue le 2026-07-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/3 actives (0 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 0/3 actives (0 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gearboxquebec` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gearboxquebec' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Gearbox Studio Québec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/gearboxquebec.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/genetec_inc.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/genetec_inc.md
7 +Rôle : Fiche connecteur — Genetec (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Genetec (`genetec_inc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/genetec_inc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Genetec](https://genetec.com)
20 +- **Page carrières** : https://apply.workable.com/genetec-inc
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Genetec` |
33 +| `ORG` | `genetec-inc` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **79 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 18 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 99 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 81 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Spécialiste en test logiciel / Software Test Specialist - Core Platform* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 79 (dont **79 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/79 actives (0 %)
76 +- **GPS** : 79/79 actives (100 %)
77 +- **Mode** : 14/79 actives (18 %)
78 +- **Parution** : 79/79 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 81, +0, ~4, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync genetec_inc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='genetec_inc' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Genetec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/genetec_inc.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/gfs.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gfs.md
7 +Rôle : Fiche connecteur — Service alimentaire Gordon (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Service alimentaire Gordon (`gfs`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/gfs.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Service alimentaire Gordon](https://gfs.ca)
20 +- **Page carrières** : https://gfs.wd5.myworkdayjobs.com/usjobs-french
21 +- **Secteurs** : manufacturier/commerce
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Service alimentaire Gordon` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `usjobs-french` |
35 +| `TENANT` | `gfs` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **31 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 55 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 55 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 77 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
63 +
64 +Exemple réel : *Aide Livreur - Soir* — Québec · Taux horaire de 23,16$/h · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 31 (dont **31 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 17/31 actives (55 %)
83 +- **GPS** : 0/31 actives (0 %)
84 +- **Mode** : 0/31 actives (0 %)
85 +- **Parution** : 31/31 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 31, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gfs` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gfs' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Service alimentaire Gordon » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/gfs.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/gologic.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gologic.md
7 +Rôle : Fiche connecteur — GoLogic (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# GoLogic (`gologic`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/gologic.py`
16 +
17 +## Description
18 +
19 +- **Site** : [GoLogic]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/gologic
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `gologic` |
33 +| `EMPLOYER` | `GoLogic` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 0 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Poste Java* — Montréal · ∅ · parue le 2021-11-16.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/1 actives (0 %)
81 +- **GPS** : 1/1 actives (100 %)
82 +- **Mode** : 0/1 actives (0 %)
83 +- **Parution** : 1/1 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 1, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gologic` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gologic' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez GoLogic » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/gologic.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/gorh.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gorh.md
7 +Rôle : Fiche connecteur — Go RH (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Go RH (`gorh`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/gorh.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Go RH]()
20 +- **Page carrières** : https://jobs.lever.co/gorh
21 +- **Secteurs** : Placement, RH
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Go RH` |
33 +| `ORG` | `gorh` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **266 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 83 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 98 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 95 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 18 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 13 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 73 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 97 % |
61 +
62 +Exemple réel : *Chef d'équipe de production avec volet contrôle qualité* — Sherbrooke · Salaire : Fourchette salariale entre 55 000$ et 65 000$ selon l’expérience · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 266 (dont **266 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 49/266 actives (18 %)
76 +- **GPS** : 259/266 actives (97 %)
77 +- **Mode** : 262/266 actives (98 %)
78 +- **Parution** : 266/266 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 266, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gorh` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gorh' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Go RH » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/gorh.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/groupecanam.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/groupecanam.md
7 +Rôle : Fiche connecteur — Groupe Canam (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Groupe Canam (`groupecanam`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/groupecanam.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Groupe Canam]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/groupecanam
21 +- **Secteurs** : Production, Construction
22 +- **Région** : Saint-Georges
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `groupecanam` |
33 +| `EMPLOYER` | `Groupe Canam` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **67 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 27 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 63 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 63 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 70 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 99 % |
61 +
62 +Exemple réel : *Soudeur(euse)* — Saint-Gédéon-de-Beauce · On t’offre un salaire selon ton expérience entre 26,47 $ et 30,68 $ de l'heure parce que l… · parue le 2026-08-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 67 (dont **67 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 42/67 actives (63 %)
81 +- **GPS** : 66/67 actives (99 %)
82 +- **Mode** : 18/67 actives (27 %)
83 +- **Parution** : 67/67 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 66, +1, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync groupecanam` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='groupecanam' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Groupe Canam » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/groupecanam.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/gsk.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gsk.md
7 +Rôle : Fiche connecteur — GSK (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# GSK (`gsk`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/gsk.py`
16 +
17 +## Description
18 +
19 +- **Site** : [GSK]()
20 +- **Page carrières** : https://gsk.wd5.myworkdayjobs.com/GSKCareers
21 +- **Secteurs** : Pharmaceutique
22 +- **Région** : Laval, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `GSK` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `GSKCareers` |
35 +| `TENANT` | `gsk` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **12 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 83 % |
50 +| `region` — Région | région administrative | 67 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 83 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 83 % |
63 +
64 +Exemple réel : *Chef de territoire en Estrie/Sherbrooke (12mois)* — Québec · ∅ · parue le 2026-08-13.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 12 (dont **12 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/12 actives (0 %)
83 +- **GPS** : 10/12 actives (83 %)
84 +- **Mode** : 0/12 actives (0 %)
85 +- **Parution** : 12/12 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:24 — trouvées 12, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 14
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gsk` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gsk' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez GSK » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/gsk.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/guichet_emplois.md +122 −0
@@ -0,0 +1,122 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/guichet_emplois.md
7 +Rôle : Fiche connecteur — portail agrégateur Guichet-Emplois (Canada)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Guichet-Emplois (Canada) (`guichet_emplois`) — portail agrégateur
14 +
15 +**Portail agrégateur** (`dedup.AGGREGATORS`) : source complémentaire, moins autoritaire qu'une page carrière. En cas de doublon avec une offre directe, **l'offre directe gagne la canonique** et la copie portail est masquée (`dup_of`). Ces offres ne portent pas le badge « Offre directe ».
16 +
17 +## Description
18 +
19 +- **Portail** : [Guichet-Emplois (Canada)](https://www.guichetemplois.gc.ca)
20 +- **Secteurs** : Portail, Tous secteurs
21 +
22 +> Portail Guichet-Emplois (guichetemplois.gc.ca — gouvernement du Canada).
23 +>
24 +> Recherche HTML rendue côté serveur (27 offres/page) filtrée province=QC et
25 +> publication récente (fage). Chaque résultat inclut titre, employeur, ville,
26 +> salaire et date — la description est lue sur la page de l'offre (cache BD +
27 +> budget). Chaque fiche renvoie vers la page Guichet-Emplois, qui référence
28 +> l'offre originale — conformité aux conditions d'utilisation du site.
29 +>
30 +> robots.txt impose « Crawl-delay: 5 » : request_delay = 5 s, d'où une fenêtre
31 +> volontairement bornée (pages et détails limités par synchronisation).
32 +
33 +## Accès
34 +
35 +- **Endpoint** (`BASE`) : `https://www.guichetemplois.gc.ca`
36 +- **Pagination** : flux unique (une requête liste)
37 +- **Backend** : GET direct `requests` (throttlé, UA `JobKaBot/1.0`)
38 +- **Throttle** : 5.0 s entre requêtes — **respect du `Crawl-delay: 5` de robots.txt**.
39 +
40 +## Champs → schéma
41 +
42 +Complétude mesurée sur les **25 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
43 +
44 +| Champ (`jobs.*`) | Rôle | Complétude |
45 +|---|---|---|
46 +| `title` — Titre | titre du poste | 100 % |
47 +| `employer` — Employeur | nom de l'entreprise | 100 % |
48 +| `url` — URL | lien direct vers l'offre originale | 100 % |
49 +| `description` — Description | texte complet (HTML nettoyé) | 80 % |
50 +| `city` — Ville | municipalité normalisée | 100 % |
51 +| `region` — Région | région administrative | 100 % |
52 +| `address` — Adresse | adresse du lieu de travail | 0 % |
53 +| `postal_code` — Code postal | code postal si publié | 0 % |
54 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
55 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
56 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
57 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
58 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
59 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
60 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
61 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
62 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 76 % |
63 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
64 +
65 +Exemple réel : *commis administratif/commis administrative de bureau* — Drummondville · 20,00 $ de l'heure · parue le 2026-08-18.
66 +
67 +## Fréquence & budgets
68 +
69 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
70 +- **Throttle** : 5.0 s minimum entre deux requêtes vers la source (`request_delay`).
71 +- **Budgets / plafonds (variables d'environnement)** :
72 +
73 +| Variable | Défaut |
74 +|---|---|
75 +| `JOBKA_GUICHET_DAYS` | `7` |
76 +| `JOBKA_GUICHET_PAGES` | `20` |
77 +| `JOBKA_GUICHET_DETAIL_LIMIT` | `50` |
78 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
79 +
80 +## Volumétrie & complétude live
81 +
82 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
83 +
84 +- **Offres en base** : 25 (dont **25 actives**, 0 masquées comme doublons `dup_of`)
85 +- **Salaire** : 25/25 actives (100 %)
86 +- **GPS** : 0/25 actives (0 %)
87 +- **Mode** : 0/25 actives (0 %)
88 +- **Parution** : 25/25 actives (100 %)
89 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 0, +0, ~0, -0, **ÉCHEC : HTTPSConnectionPool(host='www.guichetemplois.gc.ca', port=443): Read timed out. (read time…**
90 +- **Syncs enregistrés** (`sync_log`) : 6
91 +
92 +## Erreurs & dépannage
93 +
94 +Erreurs relevées dans `sync_log` :
95 +
96 +| Erreur | Occurrences | Dernière fois |
97 +|---|---|---|
98 +| HTTPSConnectionPool(host='www.guichetemplois.gc.ca', port=443): Read timed out. (read time… | 1 | 2026-08-18 11:25 |
99 +| ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'… | 3 | 2026-08-18 11:10 |
100 +
101 +- Le WAF gouvernemental coupe parfois la connexion en cours de pagination : le connecteur fait un retry puis conserve l'acquis partiel (commit `1604ff9`) — une erreur `RemoteDisconnected`/`Read timed out` ponctuelle est attendue et non bloquante.
102 +- Rejouer un sync isolé : `.venv/bin/python run.py sync guichet_emplois` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='guichet_emplois' ORDER BY ts DESC LIMIT 5;"`
103 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
104 +
105 +## Licence / conformité
106 +
107 +Scraping de pages **publiques** (gouvernement du Canada) avec lien vers la fiche Guichet-Emplois, qui référence l'offre originale. `robots.txt` respecté — **Crawl-delay: 5 s appliqué** (`request_delay = 5.0`), fenêtre bornée (pages + détails plafonnés). Aucune donnée personnelle de candidat collectée.
108 +
109 +## Historique
110 +
111 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
112 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
113 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
114 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
115 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
116 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
117 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
118 +
119 +Commits touchant `jobka/connectors/guichet_emplois.py` :
120 +
121 +- `1604ff9` 2026-08-18 Guichet-Emplois : reprise sur coupure WAF (retry + acquis partiel) ; fixtures cascades/cssdm
122 +- `f6e7571` 2026-08-18 Portails agrégateurs : Guichet-Emplois, Jobillico, Espresso-Jobs — l offre directe gagne toujours la canonique
added docs/connecteurs/gurussolutions.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/gurussolutions.md
7 +Rôle : Fiche connecteur — GURUS Solutions (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# GURUS Solutions (`gurussolutions`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/gurussolutions.py`
16 +
17 +## Description
18 +
19 +- **Site** : [GURUS Solutions]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/gurussolutions
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `gurussolutions` |
33 +| `EMPLOYER` | `GURUS Solutions` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 12 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Cloud Developer - Product DevOps* — Montréal · ∅ · parue le 2026-08-06.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/8 actives (0 %)
76 +- **GPS** : 8/8 actives (100 %)
77 +- **Mode** : 0/8 actives (0 %)
78 +- **Parution** : 8/8 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 8, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync gurussolutions` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='gurussolutions' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez GURUS Solutions » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/gurussolutions.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/hopper.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/hopper.md
7 +Rôle : Fiche connecteur — Hopper (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Hopper (`hopper`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/hopper.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Hopper]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/hopper
21 +- **Secteurs** : TI, Voyage
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Hopper` |
33 +| `ORG` | `hopper` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 67 % |
48 +| `region` — Région | région administrative | 67 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 67 % |
61 +
62 +Exemple réel : *Directeur ou directrice principal(e) de produit, IA conversationnelle// Principal Product …* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/6 actives (0 %)
76 +- **GPS** : 4/6 actives (67 %)
77 +- **Mode** : 6/6 actives (100 %)
78 +- **Parution** : 6/6 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 6, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync hopper` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='hopper' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Hopper » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/hopper.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/hoyoverse.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/hoyoverse.md
7 +Rôle : Fiche connecteur — HoYoverse (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# HoYoverse (`hoyoverse`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/hoyoverse.py`
16 +
17 +## Description
18 +
19 +- **Site** : [HoYoverse]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/hoyoverse
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `hoyoverse` |
33 +| `EMPLOYER` | `HoYoverse` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Senior Combat Designer [CA]* — Montréal · ∅ · parue le 2023-02-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/4 actives (0 %)
81 +- **GPS** : 4/4 actives (100 %)
82 +- **Mode** : 4/4 actives (100 %)
83 +- **Parution** : 4/4 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 4, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync hoyoverse` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='hoyoverse' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez HoYoverse » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/hoyoverse.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/huaweicanada.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/huaweicanada.md
7 +Rôle : Fiche connecteur — Huawei Canada (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Huawei Canada (`huaweicanada`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/huaweicanada.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Huawei Canada]()
20 +- **Page carrières** : https://huaweicanada.recruitee.com
21 +- **Secteurs** : TI, Recherche
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Huawei Canada` |
33 +| `ORG` | `huaweicanada` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **18 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 94 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 11 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 11 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 44 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Machine Learning Researcher -LLM Agents & Efficient Deep Learning* — Montréal · l target annual compensation for this position ranges from $106,000 to $156,000 depending … · parue le 2026-05-05.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 18 (dont **18 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 2/18 actives (11 %)
76 +- **GPS** : 18/18 actives (100 %)
77 +- **Mode** : 18/18 actives (100 %)
78 +- **Parution** : 18/18 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 18, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync huaweicanada` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='huaweicanada' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Huawei Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/huaweicanada.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ia_groupe.md +117 −0
@@ -0,0 +1,117 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ia_groupe.md
7 +Rôle : Fiche connecteur — iA Groupe financier (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# iA Groupe financier (`ia_groupe`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/ia_groupe.py`
16 +
17 +## Description
18 +
19 +- **Site** : [iA Groupe financier](https://ia.ca)
20 +- **Page carrières** : https://ia.wd3.myworkdayjobs.com/Professional
21 +- **Secteurs** : Assurance, Finance, TI
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `iA Groupe financier` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Professional` |
35 +| `TENANT` | `ia` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **16 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 6 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 6 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 6 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Transaction Technician* — Québec · The typical hiring range for this position is between $50,000 and $52,000; base salary may… · parue le 2026-08-07.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 16 (dont **16 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/16 actives (6 %)
83 +- **GPS** : 16/16 actives (100 %)
84 +- **Mode** : 1/16 actives (6 %)
85 +- **Parution** : 16/16 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 16, +0, ~1, -0
87 +- **Syncs enregistrés** (`sync_log`) : 17
88 +
89 +## Erreurs & dépannage
90 +
91 +Erreurs relevées dans `sync_log` :
92 +
93 +| Erreur | Occurrences | Dernière fois |
94 +|---|---|---|
95 +| HTTPSConnectionPool(host='ia.wd3.myworkdayjobs.com', port=443): Read timed out. (read time… | 1 | 2026-08-17 20:48 |
96 +| ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'… | 1 | 2026-08-17 20:43 |
97 +
98 +- Rejouer un sync isolé : `.venv/bin/python run.py sync ia_groupe` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ia_groupe' ORDER BY ts DESC LIMIT 5;"`
99 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
100 +
101 +## Licence / conformité
102 +
103 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez iA Groupe financier » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
104 +
105 +## Historique
106 +
107 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
108 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
109 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
110 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
111 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
112 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
113 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
114 +
115 +Commits touchant `jobka/connectors/ia_groupe.py` :
116 +
117 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/industrious.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/industrious.md
7 +Rôle : Fiche connecteur — Industrious (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Industrious (`industrious`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/industrious.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Industrious]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/industrious
21 +- **Secteurs** : Immobilier, Services
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Industrious` |
33 +| `ORG` | `industrious` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Tech Lead, DevOps Engineer* — Montréal · ∅ · parue le 2026-08-03.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 1/1 actives (100 %)
77 +- **Mode** : 0/1 actives (0 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync industrious` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='industrious' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Industrious » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/industrious.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ino_ca.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ino_ca.md
7 +Rôle : Fiche connecteur — Luqia (INO) (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Luqia (INO) (`ino_ca`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/ino_ca.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Luqia (INO)]()
20 +- **Page carrières** : https://ino-ca.breezy.hr
21 +- **Secteurs** : Optique-photonique, Recherche
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Luqia (INO)` |
33 +| `ORG` | `ino-ca` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **7 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 71 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Technicien.ne fabrication– systèmes optiques* — Québec · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 7 (dont **7 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/7 actives (0 %)
76 +- **GPS** : 7/7 actives (100 %)
77 +- **Mode** : 0/7 actives (0 %)
78 +- **Parution** : 7/7 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:25 — trouvées 7, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync ino_ca` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ino_ca' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Luqia (INO) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/ino_ca.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/intactfc.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/intactfc.md
7 +Rôle : Fiche connecteur — Intact Corporation financière (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Intact Corporation financière (`intactfc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/intactfc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Intact Corporation financière]()
20 +- **Page carrières** : https://intactfc.wd3.myworkdayjobs.com/Intactfc
21 +- **Secteurs** : Assurance
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Intact Corporation financière` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `Intactfc` |
35 +| `TENANT` | `intactfc` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Conseiller, Ventes & Service à la clientèle* — Québec · ∅ · parue le 2026-08-14.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/23 actives (0 %)
83 +- **GPS** : 23/23 actives (100 %)
84 +- **Mode** : 0/23 actives (0 %)
85 +- **Parution** : 23/23 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 23, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync intactfc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='intactfc' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Intact Corporation financière » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/intactfc.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/investpsp.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/investpsp.md
7 +Rôle : Fiche connecteur — Investissements PSP (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Investissements PSP (`investpsp`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/investpsp.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Investissements PSP](https://investpsp.com)
20 +- **Page carrières** : https://investpsp.wd3.myworkdayjobs.com/psp_careers
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Investissements PSP` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `psp_careers` |
35 +| `TENANT` | `investpsp` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **44 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 2 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 2 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 39 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Associate, Real Estate Investments* — Montréal · 14 to $82 · parue le 2026-07-19.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 44 (dont **44 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/44 actives (2 %)
83 +- **GPS** : 44/44 actives (100 %)
84 +- **Mode** : 0/44 actives (0 %)
85 +- **Parution** : 44/44 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 44, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync investpsp` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='investpsp' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Investissements PSP » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/investpsp.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/investquebec.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/investquebec.md
7 +Rôle : Fiche connecteur — Investissement Québec (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Investissement Québec (`investquebec`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/investquebec.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Investissement Québec](https://investquebec.com)
20 +- **Page carrières** : https://investquebec.wd10.myworkdayjobs.com/Ext
21 +- **Secteurs** : n/d
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Investissement Québec` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `Ext` |
35 +| `TENANT` | `investquebec` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **13 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 8 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 8 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 31 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Stagiaire, Directeur de comptes, Réseau régional (Québec, Ste-Marie ou St-Georges)* — Québec · Salaire : 20,87 $ à 30,93 $ de l’heure selon le niveau de scolarité · parue le 2026-07-28.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 13 (dont **13 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/13 actives (8 %)
83 +- **GPS** : 13/13 actives (100 %)
84 +- **Mode** : 0/13 actives (0 %)
85 +- **Parution** : 13/13 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 13, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync investquebec` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='investquebec' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Investissement Québec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/investquebec.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/jexcelleinc.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/jexcelleinc.md
7 +Rôle : Fiche connecteur — J'Excelle (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# J'Excelle (`jexcelleinc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/jexcelleinc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [J'Excelle]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/JExcelleInc
21 +- **Secteurs** : Placement
22 +- **Région** : Montréal, Laval, Gatineau
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `JExcelleInc` |
33 +| `EMPLOYER` | `J'Excelle` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 11 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Orthopédagogue ou Enseignant à Trois-Rivières* — Trois-Rivières · ∅ · parue le 2024-01-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/9 actives (0 %)
81 +- **GPS** : 9/9 actives (100 %)
82 +- **Mode** : 1/9 actives (11 %)
83 +- **Parution** : 9/9 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 9, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync jexcelleinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='jexcelleinc' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez J'Excelle » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/jexcelleinc.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/jgrivesud.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/jgrivesud.md
7 +Rôle : Fiche connecteur — JG Rive-Sud (GFS) (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# JG Rive-Sud (GFS) (`jgrivesud`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/jgrivesud.py`
16 +
17 +## Description
18 +
19 +- **Site** : [JG Rive-Sud (GFS)](https://jgfruitsetlegumes.com)
20 +- **Page carrières** : https://gfs.wd5.myworkdayjobs.com/jgrive-sud
21 +- **Secteurs** : manufacturier/commerce
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `JG Rive-Sud (GFS)` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `jgrive-sud` |
35 +| `TENANT` | `gfs` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 70 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 70 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
63 +
64 +Exemple réel : *Commis entrepôt au mixte -Soir* — Québec · mis Mixte (Préparation / Tri) - Nuit, Permanent - Chambly : 17,77 $/h + Prime · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 7/10 actives (70 %)
83 +- **GPS** : 0/10 actives (0 %)
84 +- **Mode** : 0/10 actives (0 %)
85 +- **Parution** : 10/10 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 10, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync jgrivesud` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='jgrivesud' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez JG Rive-Sud (GFS) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/jgrivesud.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/jobillico.md +119 −0
@@ -0,0 +1,119 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/jobillico.md
7 +Rôle : Fiche connecteur — portail agrégateur Jobillico
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Jobillico (`jobillico`) — portail agrégateur
14 +
15 +**Portail agrégateur** (`dedup.AGGREGATORS`) : source complémentaire, moins autoritaire qu'une page carrière. En cas de doublon avec une offre directe, **l'offre directe gagne la canonique** et la copie portail est masquée (`dup_of`). Ces offres ne portent pas le badge « Offre directe ».
16 +
17 +## Description
18 +
19 +- **Portail** : [Jobillico](https://www.jobillico.com)
20 +- **Secteurs** : Portail, Tous secteurs
21 +
22 +> Portail Jobillico (jobillico.com).
23 +>
24 +> - liste : sitemaps publics sitemap_job_postings_{1..4}.xml (~30 000 offres,
25 +> loc + lastmod) — on suit les N plus récentes (fenêtre glissante) ;
26 +> - détail : chaque page offre embarque un JSON-LD schema.org/JobPosting complet
27 +> (employeur, description, lieu, salaire) — cache BD + budget de
28 +> nouvelles visites par synchronisation.
29 +>
30 +> Le filtre Québec s'applique après lecture du détail (le portail publie aussi
31 +> quelques offres hors province).
32 +
33 +## Accès
34 +
35 +- **Endpoint** (`BASE`) : `https://www.jobillico.com`
36 +- **Pagination** : parcours de sitemap XML
37 +- **Backend** : GET direct `requests` (throttlé, UA `JobKaBot/1.0`)
38 +- **Throttle** : 0.6 s entre requêtes.
39 +
40 +## Champs → schéma
41 +
42 +Complétude mesurée sur les **249 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
43 +
44 +| Champ (`jobs.*`) | Rôle | Complétude |
45 +|---|---|---|
46 +| `title` — Titre | titre du poste | 100 % |
47 +| `employer` — Employeur | nom de l'entreprise | 100 % |
48 +| `url` — URL | lien direct vers l'offre originale | 100 % |
49 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
50 +| `city` — Ville | municipalité normalisée | 100 % |
51 +| `region` — Région | région administrative | 60 % |
52 +| `address` — Adresse | adresse du lieu de travail | 84 % |
53 +| `postal_code` — Code postal | code postal si publié | 88 % |
54 +| `work_mode` — Mode | presentiel / hybride / teletravail | 6 % |
55 +| `employment_type` — Type | temps_plein / temps_partiel / … | 23 % |
56 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 49 % |
57 +| `salary_label` — Libellé salaire | texte salarial original | 5 % |
58 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
59 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
60 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
61 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
62 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 79 % |
63 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
64 +
65 +Exemple réel : *Chauffeur(es) classe 1 ou 3 longue distance* — Montréal · Provincial : 21 $/h · parue le 2026-08-18.
66 +
67 +## Fréquence & budgets
68 +
69 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
70 +- **Throttle** : 0.6 s minimum entre deux requêtes vers la source (`request_delay`).
71 +- **Budgets / plafonds (variables d'environnement)** :
72 +
73 +| Variable | Défaut |
74 +|---|---|
75 +| `JOBKA_JOBILLICO_TRACK` | `2500` |
76 +| `JOBKA_JOBILLICO_DETAIL_LIMIT` | `250` |
77 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
78 +
79 +## Volumétrie & complétude live
80 +
81 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
82 +
83 +- **Offres en base** : 249 (dont **249 actives**, 0 masquées comme doublons `dup_of`)
84 +- **Salaire** : 122/249 actives (49 %)
85 +- **GPS** : 249/249 actives (100 %)
86 +- **Mode** : 15/249 actives (6 %)
87 +- **Parution** : 249/249 actives (100 %)
88 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 0, +0, ~0, -0, **ÉCHEC : 410 Client Error: Gone for url: https://www.jobillico.com/fr/offre-d-emploi/lebeau-vitres-…**
89 +- **Syncs enregistrés** (`sync_log`) : 3
90 +
91 +## Erreurs & dépannage
92 +
93 +Erreurs relevées dans `sync_log` :
94 +
95 +| Erreur | Occurrences | Dernière fois |
96 +|---|---|---|
97 +| 410 Client Error: Gone for url: https://www.jobillico.com/fr/offre-d-emploi/lebeau-vitres-… | 2 | 2026-08-18 11:26 |
98 +
99 +- Un `410 Gone` sur une page offre est normal (offre retirée entre le sitemap et la visite) — non bloquant.
100 +- Rejouer un sync isolé : `.venv/bin/python run.py sync jobillico` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='jobillico' ORDER BY ts DESC LIMIT 5;"`
101 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
102 +
103 +## Licence / conformité
104 +
105 +Parcours des **sitemaps publics** (`sitemap_job_postings_*.xml`) et lecture du **JSON-LD schema.org/JobPosting** que chaque page offre publie à destination des moteurs de recherche. Lien vers l'offre originale sur Jobillico. robots.txt respecté ; budgets de visites par sync. Aucune donnée personnelle de candidat collectée.
106 +
107 +## Historique
108 +
109 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
110 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
111 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
112 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
113 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
114 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
115 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
116 +
117 +Commits touchant `jobka/connectors/jobillico.py` :
118 +
119 +- `f6e7571` 2026-08-18 Portails agrégateurs : Guichet-Emplois, Jobillico, Espresso-Jobs — l offre directe gagne toujours la canonique
added docs/connecteurs/korem.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/korem.md
7 +Rôle : Fiche connecteur — Korem (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Korem (`korem`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/korem.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Korem]()
20 +- **Page carrières** : https://korem.bamboohr.com/careers
21 +- **Secteurs** : TI
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Korem` |
33 +| `ORG` | `korem` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 75 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 25 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Contrôleur·euse de projet (PCO)* — Québec · ∅ · parue le 2026-05-28.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/4 actives (0 %)
81 +- **GPS** : 4/4 actives (100 %)
82 +- **Mode** : 0/4 actives (0 %)
83 +- **Parution** : 4/4 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 4, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync korem` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='korem' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Korem » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/korem.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/kpidigital.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/kpidigital.md
7 +Rôle : Fiche connecteur — KPI Digital (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# KPI Digital (`kpidigital`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/kpidigital.py`
16 +
17 +## Description
18 +
19 +- **Site** : [KPI Digital]()
20 +- **Page carrières** : https://kpidigital.bamboohr.com/careers
21 +- **Secteurs** : TI, Données
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `KPI Digital` |
33 +| `ORG` | `kpidigital` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **11 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 82 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Senior Manager-Consulting/ Gestionnaire senior – consultant(e)* — Montréal · ∅ · parue le 2026-04-24.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 11 (dont **11 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/11 actives (0 %)
81 +- **GPS** : 11/11 actives (100 %)
82 +- **Mode** : 0/11 actives (0 %)
83 +- **Parution** : 11/11 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 11, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync kpidigital` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='kpidigital' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez KPI Digital » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/kpidigital.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/labelink.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/labelink.md
7 +Rôle : Fiche connecteur — Produits Labelink (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Produits Labelink (`labelink`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/labelink.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Produits Labelink]()
20 +- **Page carrières** : https://labelink.bamboohr.com/careers
21 +- **Secteurs** : Impression, Manufacture
22 +- **Région** : Montréal, Laval, Granby
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Produits Labelink` |
33 +| `ORG` | `labelink` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **17 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Opérateur/trice de Presse - Imprimerie Soir* — Montréal · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 17 (dont **17 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/17 actives (0 %)
81 +- **GPS** : 17/17 actives (100 %)
82 +- **Mode** : 0/17 actives (0 %)
83 +- **Parution** : 17/17 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 17, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync labelink` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='labelink' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Produits Labelink » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/labelink.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/lamour.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lamour.md
7 +Rôle : Fiche connecteur — Lamour (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Lamour (`lamour`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/lamour.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Lamour]()
20 +- **Page carrières** : https://apply.workable.com/lamour
21 +- **Secteurs** : Textile, Manufacture
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Lamour` |
33 +| `ORG` | `lamour` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **10 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 30 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordinateur(trice) des ventes / Sales Coordinator* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 10 (dont **10 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/10 actives (0 %)
76 +- **GPS** : 10/10 actives (100 %)
77 +- **Mode** : 0/10 actives (0 %)
78 +- **Parution** : 10/10 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 10, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lamour` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lamour' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Lamour » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/lamour.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/lassonde.md +89 −0
@@ -0,0 +1,89 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lassonde.md
7 +Rôle : Fiche connecteur — Industries Lassonde (employeur direct, ATS adp)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Industries Lassonde (`lassonde`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`adp`](ats-adp.md) · Statut registre : actif · Connecteur : `jobka/connectors/lassonde.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Industries Lassonde](https://www.lassonde.com)
20 +- **Page carrières** : https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=f96ce972-7721-4c7b-99ea-9a970ddc824a&ccId=19000101_000001&lang=fr_CA
21 +- **Secteurs** : Agroalimentaire, Fabrication
22 +- **Région** : Rougemont, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-adp.md`](ats-adp.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `CCID` | `9200604444876_2` |
33 +| `CID` | `f96ce972-7721-4c7b-99ea-9a970ddc824a` |
34 +| `EMPLOYER` | `Industries Lassonde` |
35 +| `LANG` | `fr_CA` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +*Aucune offre active en base pour cette source.*
42 +
43 +## Fréquence & budgets
44 +
45 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
46 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
47 +- **Budgets / plafonds (variables d'environnement)** :
48 +
49 +| Variable | Défaut |
50 +|---|---|
51 +| `JOBKA_ADP_DETAIL_LIMIT` | `80` |
52 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
53 +
54 +## Volumétrie & complétude live
55 +
56 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
57 +
58 +- **Offres en base** : 0 (dont **0 actives**, 0 masquées comme doublons `dup_of`)
59 +- **Salaire** : 0/0 actives (—)
60 +- **GPS** : 0/0 actives (—)
61 +- **Mode** : 0/0 actives (—)
62 +- **Parution** : 0/0 actives (—)
63 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 0, +0, ~0, -0
64 +- **Syncs enregistrés** (`sync_log`) : 5
65 +
66 +## Erreurs & dépannage
67 +
68 +Aucune erreur dans `sync_log` pour cette source.
69 +
70 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lassonde` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lassonde' ORDER BY ts DESC LIMIT 5;"`
71 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
72 +
73 +## Licence / conformité
74 +
75 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Industries Lassonde » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
76 +
77 +## Historique
78 +
79 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
80 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
81 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
82 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
83 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
84 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
85 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
86 +
87 +Commits touchant `jobka/connectors/lassonde.py` :
88 +
89 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/levio.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/levio.md
7 +Rôle : Fiche connecteur — Levio (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Levio (`levio`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/levio.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Levio]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/levio
21 +- **Secteurs** : TI
22 +- **Région** : Québec, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `levio` |
33 +| `EMPLOYER` | `Levio` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **42 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 83 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Conseiller.ère en analyse fonctionnelle IA* — Montréal · ∅ · parue le 2026-05-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 42 (dont **42 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/42 actives (0 %)
76 +- **GPS** : 42/42 actives (100 %)
77 +- **Mode** : 0/42 actives (0 %)
78 +- **Parution** : 42/42 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 42, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync levio` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='levio' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Levio » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/levio.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/lg2.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lg2.md
7 +Rôle : Fiche connecteur — LG2 (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# LG2 (`lg2`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/lg2.py`
16 +
17 +## Description
18 +
19 +- **Site** : [LG2]()
20 +- **Page carrières** : https://lg2.recruitee.com
21 +- **Secteurs** : Publicité, Création
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `LG2` |
33 +| `ORG` | `lg2` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **14 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 7 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 86 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Directeur·trice principal·e, Culture et talents* — Montréal · ∅ · parue le 2026-08-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 14 (dont **14 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/14 actives (7 %)
76 +- **GPS** : 14/14 actives (100 %)
77 +- **Mode** : 14/14 actives (100 %)
78 +- **Parution** : 14/14 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 14, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lg2` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lg2' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez LG2 » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/lg2.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/lidd.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lidd.md
7 +Rôle : Fiche connecteur — LIDD Consultants (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# LIDD Consultants (`lidd`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/lidd.py`
16 +
17 +## Description
18 +
19 +- **Site** : [LIDD Consultants]()
20 +- **Page carrières** : https://apply.workable.com/lidd
21 +- **Secteurs** : Conseil, Logistique
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `LIDD Consultants` |
33 +| `ORG` | `lidd` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Consultant WMS / WMS Consultant* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/8 actives (0 %)
76 +- **GPS** : 8/8 actives (100 %)
77 +- **Mode** : 0/8 actives (0 %)
78 +- **Parution** : 8/8 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 8, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lidd` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lidd' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez LIDD Consultants » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/lidd.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/lightspeedhq.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lightspeedhq.md
7 +Rôle : Fiche connecteur — Lightspeed Commerce (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Lightspeed Commerce (`lightspeedhq`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/lightspeedhq.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Lightspeed Commerce]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/lightspeedhq
21 +- **Secteurs** : TI
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Lightspeed Commerce` |
33 +| `ORG` | `lightspeedhq` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **56 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 98 % |
48 +| `region` — Région | région administrative | 98 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 7 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 7 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 98 % |
61 +
62 +Exemple réel : *Principal Product Designer, Retail* — Montréal · $200K - $240K · parue le 2026-07-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 58 (dont **56 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 4/56 actives (7 %)
76 +- **GPS** : 55/56 actives (98 %)
77 +- **Mode** : 56/56 actives (100 %)
78 +- **Parution** : 56/56 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 56, +0, ~0, -2
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lightspeedhq` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lightspeedhq' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Lightspeed Commerce » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/lightspeedhq.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/logisco.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/logisco.md
7 +Rôle : Fiche connecteur — Logisco (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Logisco (`logisco`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/logisco.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Logisco](https://logisco.com)
20 +- **Page carrières** : https://logisco.bamboohr.com/careers
21 +- **Secteurs** : Immobilier
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Logisco` |
33 +| `ORG` | `logisco` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **13 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 38 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 38 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 85 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 54 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Réceptionniste d'hôtel - temps partiel* — Québec · Salaire établi selon l'expérience débutant à 20,26 $/h; · parue le 2025-01-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 13 (dont **13 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 5/13 actives (38 %)
81 +- **GPS** : 13/13 actives (100 %)
82 +- **Mode** : 0/13 actives (0 %)
83 +- **Parution** : 13/13 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 13, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync logisco` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='logisco' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Logisco » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/logisco.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/lush.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/lush.md
7 +Rôle : Fiche connecteur — Lush Cosmétiques (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Lush Cosmétiques (`lush`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/lush.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Lush Cosmétiques]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/lush
21 +- **Secteurs** : Commerce de détail
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `lush` |
33 +| `EMPLOYER` | `Lush Cosmétiques` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 40 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 20 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Assistant Gerant - Galeries d'Anjou* — Montréal · $48,500 &mdash; $48,500 CAD · parue le 2026-08-06.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 5/5 actives (100 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 0/5 actives (0 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync lush` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='lush' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Lush Cosmétiques » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/lush.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/maintainx.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/maintainx.md
7 +Rôle : Fiche connecteur — MaintainX (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# MaintainX (`maintainx`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/maintainx.py`
16 +
17 +## Description
18 +
19 +- **Site** : [MaintainX]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/maintainx
21 +- **Secteurs** : TI, SaaS
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `MaintainX` |
33 +| `ORG` | `maintainx` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **78 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 90 % |
48 +| `region` — Région | région administrative | 81 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 6 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 6 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 83 % |
61 +
62 +Exemple réel : *Director of Software Development, Platform* — Montréal · $150 million Series D round, bringing our total funding to $254 million and valuing the co… · parue le 2026-05-26.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 79 (dont **78 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 5/78 actives (6 %)
76 +- **GPS** : 65/78 actives (83 %)
77 +- **Mode** : 78/78 actives (100 %)
78 +- **Parution** : 78/78 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 78, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync maintainx` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='maintainx' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez MaintainX » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/maintainx.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/manulife.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/manulife.md
7 +Rôle : Fiche connecteur — Manuvie (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Manuvie (`manulife`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/manulife.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Manuvie]()
20 +- **Page carrières** : https://manulife.wd3.myworkdayjobs.com/MFCJH_Jobs
21 +- **Secteurs** : Assurance, Finance
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Manuvie` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `MFCJH_Jobs` |
35 +| `TENANT` | `manulife` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **51 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 53 % |
50 +| `region` — Région | région administrative | 53 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 31 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 90 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 90 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 63 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 71 % |
63 +
64 +Exemple réel : *Member Information Insights Analyst* — ∅ · 00 CAD - $86,625 · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 55 (dont **51 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 46/51 actives (90 %)
83 +- **GPS** : 36/51 actives (71 %)
84 +- **Mode** : 16/51 actives (31 %)
85 +- **Parution** : 51/51 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 51, +1, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync manulife` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='manulife' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Manuvie » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/manulife.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mattelinc.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mattelinc.md
7 +Rôle : Fiche connecteur — Mattel (Mega Bloks) (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mattel (Mega Bloks) (`mattelinc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/mattelinc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mattel (Mega Bloks)]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/MattelInc
21 +- **Secteurs** : Jouets, Manufacture
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `MattelInc` |
33 +| `EMPLOYER` | `Mattel (Mega Bloks)` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 17 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 83 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Gestionnaire, ingénierie de la qualité - Mattel Brick Shop* — Montréal · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/6 actives (0 %)
81 +- **GPS** : 6/6 actives (100 %)
82 +- **Mode** : 1/6 actives (17 %)
83 +- **Parution** : 6/6 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 6, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mattelinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mattelinc' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mattel (Mega Bloks) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/mattelinc.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mccarthy_tetrault.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mccarthy_tetrault.md
7 +Rôle : Fiche connecteur — McCarthy Tétrault (employeur direct, ATS icims)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# McCarthy Tétrault (`mccarthy_tetrault`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`icims`](ats-icims.md) · Statut registre : actif · Connecteur : `jobka/connectors/mccarthy_tetrault.py`
16 +
17 +## Description
18 +
19 +- **Site** : [McCarthy Tétrault](https://www.mccarthy.ca)
20 +- **Page carrières** : https://careers-mccarthyca.icims.com/jobs/search?ss=1
21 +- **Secteurs** : Juridique, Services professionnels
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-icims.md`](ats-icims.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `McCarthy Tétrault` |
33 +| `SUB` | `careers-mccarthyca` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **22 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 100 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 9 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 14 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Senior Paralegal, Business Law* — Québec · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_ICIMS_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 22 (dont **22 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/22 actives (0 %)
81 +- **GPS** : 22/22 actives (100 %)
82 +- **Mode** : 2/22 actives (9 %)
83 +- **Parution** : 22/22 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 22, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mccarthy_tetrault` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mccarthy_tetrault' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez McCarthy Tétrault » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/mccarthy_tetrault.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/mcgill.md +113 −0
@@ -0,0 +1,113 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mcgill.md
7 +Rôle : Fiche connecteur — Université McGill (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Université McGill (`mcgill`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/mcgill.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Université McGill](https://www.mcgill.ca)
20 +- **Page carrières** : https://mcgill.wd3.myworkdayjobs.com/McGill_Careers
21 +- **Secteurs** : Éducation, Recherche, Administration
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Université McGill` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `McGill_Careers` |
35 +| `TENANT` | `mcgill` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **180 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 18 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 18 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 6 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 96 % |
63 +
64 +Exemple réel : *Dental Hygienist* — Montréal · 19 - $38 · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 190 (dont **180 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 33/180 actives (18 %)
83 +- **GPS** : 173/180 actives (96 %)
84 +- **Mode** : 0/180 actives (0 %)
85 +- **Parution** : 180/180 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 180, +0, ~3, -0
87 +- **Syncs enregistrés** (`sync_log`) : 15
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mcgill` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mcgill' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Université McGill » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/mcgill.py` :
111 +
112 +- `fd4bfc8` 2026-08-18 Qualité lieux : rejet des villes canadiennes/monde hors Québec + bâtiments McGill mappés vers Montréal
113 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mckesson.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mckesson.md
7 +Rôle : Fiche connecteur — McKesson Canada (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# McKesson Canada (`mckesson`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/mckesson.py`
16 +
17 +## Description
18 +
19 +- **Site** : [McKesson Canada]()
20 +- **Page carrières** : https://mckesson.wd3.myworkdayjobs.com/External_Careers
21 +- **Secteurs** : Pharmaceutique, Distribution
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `McKesson Canada` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `External_Careers` |
35 +| `TENANT` | `mckesson` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **43 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 86 % |
50 +| `region` — Région | région administrative | 91 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 2 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 81 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 81 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 72 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 86 % |
63 +
64 +Exemple réel : *Employee Care Knowledge & Content Specialist* — Montréal · $77,600 - $129,300 · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 43 (dont **43 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 35/43 actives (81 %)
83 +- **GPS** : 37/43 actives (86 %)
84 +- **Mode** : 1/43 actives (2 %)
85 +- **Parution** : 43/43 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 43, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 14
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mckesson` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mckesson' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez McKesson Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/mckesson.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/medfar.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/medfar.md
7 +Rôle : Fiche connecteur — MEDFAR Solutions Cliniques (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# MEDFAR Solutions Cliniques (`medfar`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/medfar.py`
16 +
17 +## Description
18 +
19 +- **Site** : [MEDFAR Solutions Cliniques]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/Medfar
21 +- **Secteurs** : TI, Santé
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `Medfar` |
33 +| `EMPLOYER` | `MEDFAR Solutions Cliniques` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 96 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Spécialiste soutien à la facturation* — Montréal · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/23 actives (0 %)
81 +- **GPS** : 23/23 actives (100 %)
82 +- **Mode** : 22/23 actives (96 %)
83 +- **Parution** : 23/23 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 23, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync medfar` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='medfar' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez MEDFAR Solutions Cliniques » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/medfar.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/medialo.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/medialo.md
7 +Rôle : Fiche connecteur — Médialo (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Médialo (`medialo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/medialo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Médialo]()
20 +- **Page carrières** : https://medialo.recruitee.com
21 +- **Secteurs** : Médias
22 +- **Région** : Mont-Laurier, Terrebonne
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Médialo` |
33 +| `ORG` | `medialo` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 80 % |
61 +
62 +Exemple réel : *Contrôleur-Contrôleuse* — Saint-Sauveur-des-Monts · ∅ · parue le 2026-07-21.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/5 actives (0 %)
76 +- **GPS** : 4/5 actives (80 %)
77 +- **Mode** : 5/5 actives (100 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync medialo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='medialo' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Médialo » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/medialo.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/messer_canada.md +115 −0
@@ -0,0 +1,115 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/messer_canada.md
7 +Rôle : Fiche connecteur — Messer Canada (employeur direct, ATS ultipro)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Messer Canada (`messer_canada`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ultipro`](ats-ultipro.md) · Statut registre : actif · Connecteur : `jobka/connectors/messer_canada.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Messer Canada](https://www.messer-ca.com)
20 +- **Page carrières** : https://recruiting.ultipro.com/MES1005MESR/JobBoard/dbd63926-d756-486f-a254-b2a6ede1d26e
21 +- **Secteurs** : Gaz industriels, Industrie
22 +- **Région** : Montréal, Québec, Saint-Georges
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ultipro.md`](ats-ultipro.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `dbd63926-d756-486f-a254-b2a6ede1d26e` |
33 +| `EMPLOYER` | `Messer Canada` |
34 +| `ORG` | `MES1005MESR` |
35 +- **Throttle** : 0.8 s entre requêtes.
36 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
37 +
38 +## Champs → schéma
39 +
40 +Complétude mesurée sur les **22 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
41 +
42 +| Champ (`jobs.*`) | Rôle | Complétude |
43 +|---|---|---|
44 +| `title` — Titre | titre du poste | 100 % |
45 +| `employer` — Employeur | nom de l'entreprise | 100 % |
46 +| `url` — URL | lien direct vers l'offre originale | 100 % |
47 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
48 +| `city` — Ville | municipalité normalisée | 100 % |
49 +| `region` — Région | région administrative | 95 % |
50 +| `address` — Adresse | adresse du lieu de travail | 0 % |
51 +| `postal_code` — Code postal | code postal si publié | 100 % |
52 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
53 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
54 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 91 % |
55 +| `salary_label` — Libellé salaire | texte salarial original | 91 % |
56 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
57 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
58 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
59 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
60 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 91 % |
61 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
62 +
63 +Exemple réel : *Commis D'Entrepôt (Prime À La Signature De $3000)* — Beauce · antages sociaux: Taux de rémunération compétitif allant de $43,116 à $57,443 avec avantage… · parue le 2026-08-17.
64 +
65 +## Fréquence & budgets
66 +
67 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
68 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
69 +- **Budgets / plafonds (variables d'environnement)** :
70 +
71 +| Variable | Défaut |
72 +|---|---|
73 +| `JOBKA_ULTIPRO_DETAIL_LIMIT` | `80` |
74 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
75 +
76 +## Volumétrie & complétude live
77 +
78 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
79 +
80 +- **Offres en base** : 22 (dont **22 actives**, 0 masquées comme doublons `dup_of`)
81 +- **Salaire** : 20/22 actives (91 %)
82 +- **GPS** : 22/22 actives (100 %)
83 +- **Mode** : 0/22 actives (0 %)
84 +- **Parution** : 22/22 actives (100 %)
85 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 22, +0, ~0, -0
86 +- **Syncs enregistrés** (`sync_log`) : 4
87 +
88 +## Erreurs & dépannage
89 +
90 +Erreurs relevées dans `sync_log` :
91 +
92 +| Erreur | Occurrences | Dernière fois |
93 +|---|---|---|
94 +| 404 Client Error: Not Found for url: https://recruiting.ultipro.com/MES1005MESR/JobBoard/d… | 1 | 2026-08-18 10:21 |
95 +
96 +- Rejouer un sync isolé : `.venv/bin/python run.py sync messer_canada` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='messer_canada' ORDER BY ts DESC LIMIT 5;"`
97 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
98 +
99 +## Licence / conformité
100 +
101 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Messer Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
102 +
103 +## Historique
104 +
105 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
106 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
107 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
108 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
109 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
110 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
111 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
112 +
113 +Commits touchant `jobka/connectors/messer_canada.py` :
114 +
115 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/microhabitat.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/microhabitat.md
7 +Rôle : Fiche connecteur — MicroHabitat (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# MicroHabitat (`microhabitat`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/microhabitat.py`
16 +
17 +## Description
18 +
19 +- **Site** : [MicroHabitat]()
20 +- **Page carrières** : https://microhabitat.breezy.hr
21 +- **Secteurs** : Agriculture urbaine
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `MicroHabitat` |
33 +| `ORG` | `microhabitat` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **13 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 62 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordonnateur·trice en agriculture urbaine - Urban Farming Coordinator (UFC)* — Québec · $35+ / hour · parue le 2026-04-29.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 13 (dont **13 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 13/13 actives (100 %)
76 +- **GPS** : 13/13 actives (100 %)
77 +- **Mode** : 0/13 actives (0 %)
78 +- **Parution** : 13/13 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 13, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync microhabitat` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='microhabitat' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez MicroHabitat » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/microhabitat.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mila_2.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mila_2.md
7 +Rôle : Fiche connecteur — Mila — Institut québécois d'IA (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mila — Institut québécois d'IA (`mila_2`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/mila_2.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mila — Institut québécois d'IA](https://mila.quebec)
20 +- **Page carrières** : https://apply.workable.com/mila-2
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mila — Institut québécois d'IA` |
33 +| `ORG` | `mila-2` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 88 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 38 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordonnateur.trice, Gouvernance de l’IA / Coordinator, AI Governance* — Montréal · ∅ · parue le 2026-07-15.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/8 actives (0 %)
76 +- **GPS** : 8/8 actives (100 %)
77 +- **Mode** : 0/8 actives (0 %)
78 +- **Parution** : 8/8 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:26 — trouvées 8, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mila_2` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mila_2' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mila — Institut québécois d'IA » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/mila_2.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/mirego.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mirego.md
7 +Rôle : Fiche connecteur — Mirego (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mirego (`mirego`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/mirego.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mirego]()
20 +- **Page carrières** : https://jobs.lever.co/mirego
21 +- **Secteurs** : TI
22 +- **Région** : Québec, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mirego` |
33 +| `ORG` | `mirego` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **11 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 73 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Chargé(e) de projets agiles* — Québec · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 11 (dont **11 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/11 actives (0 %)
76 +- **GPS** : 11/11 actives (100 %)
77 +- **Mode** : 11/11 actives (100 %)
78 +- **Parution** : 11/11 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 11, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 3
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mirego` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mirego' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mirego » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/mirego.py` :
104 +
105 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/mistplay.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mistplay.md
7 +Rôle : Fiche connecteur — Mistplay (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mistplay (`mistplay`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/mistplay.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mistplay](https://www.mistplay.com)
20 +- **Page carrières** : https://jobs.lever.co/mistplay
21 +- **Secteurs** : TI, Jeu mobile
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mistplay` |
33 +| `ORG` | `mistplay` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 33 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Senior Motion Designer II* — Montréal · ∅ · parue le 2026-08-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/3 actives (33 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 3/3 actives (100 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mistplay` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mistplay' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mistplay » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/mistplay.py` :
104 +
105 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/mistral_ai.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mistral_ai.md
7 +Rôle : Fiche connecteur — Mistral AI (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mistral AI (`mistral_ai`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/mistral_ai.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mistral AI]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/mistral.ai
21 +- **Secteurs** : TI, IA
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mistral AI` |
33 +| `ORG` | `mistral.ai` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Applied AI Engineer, CyberSecurity - Montreal* — Montréal · ∅ · parue le 2026-07-27.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/5 actives (0 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 0/5 actives (0 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mistral_ai` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mistral_ai' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mistral AI » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/mistral_ai.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mitacs.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mitacs.md
7 +Rôle : Fiche connecteur — Mitacs (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mitacs (`mitacs`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/mitacs.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mitacs]()
20 +- **Page carrières** : https://mitacs.bamboohr.com/careers
21 +- **Secteurs** : Recherche, OBNL
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Mitacs` |
33 +| `ORG` | `mitacs` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 50 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordinateur ou coordinatrice bilingue des RH / Bilingual HR Coordinator* — Montréal · Échelle d’embauche : 46 875$ - 59 375$ · parue le 2026-07-31.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 4/4 actives (100 %)
81 +- **GPS** : 4/4 actives (100 %)
82 +- **Mode** : 2/4 actives (50 %)
83 +- **Parution** : 4/4 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 4, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mitacs` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mitacs' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mitacs » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/mitacs.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mitsubishi_hc_capital.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mitsubishi_hc_capital.md
7 +Rôle : Fiche connecteur — Mitsubishi HC Capital Canada (employeur direct, ATS adp)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Mitsubishi HC Capital Canada (`mitsubishi_hc_capital`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`adp`](ats-adp.md) · Statut registre : actif · Connecteur : `jobka/connectors/mitsubishi_hc_capital.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Mitsubishi HC Capital Canada](https://www.mhccna.com)
20 +- **Page carrières** : https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=b3ef4f03-f8ff-4ded-80c8-6dd5c5a224f7&ccId=9200144510729_2&lang=fr_CA
21 +- **Secteurs** : Finance, Financement commercial
22 +- **Région** : Laval, Trois-Rivières
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-adp.md`](ats-adp.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `CCID` | `9200144510729_2` |
33 +| `CID` | `b3ef4f03-f8ff-4ded-80c8-6dd5c5a224f7` |
34 +| `EMPLOYER` | `Mitsubishi HC Capital Canada` |
35 +| `LANG` | `fr_CA` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 100 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Analyste de crédit* — Trois-Rivières · ∅ · parue le 2026-08-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_ADP_DETAIL_LIMIT` | `80` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 3/6 actives (50 %)
83 +- **GPS** : 6/6 actives (100 %)
84 +- **Mode** : 0/6 actives (0 %)
85 +- **Parution** : 6/6 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mitsubishi_hc_capital` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mitsubishi_hc_capital' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Mitsubishi HC Capital Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/mitsubishi_hc_capital.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/msi_gestion.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/msi_gestion.md
7 +Rôle : Fiche connecteur — MSI Gestion immobilière (employeur direct, ATS adp)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# MSI Gestion immobilière (`msi_gestion`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`adp`](ats-adp.md) · Statut registre : actif · Connecteur : `jobka/connectors/msi_gestion.py`
16 +
17 +## Description
18 +
19 +- **Site** : [MSI Gestion immobilière](https://www.msimmobiliers.com)
20 +- **Page carrières** : https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=47d4e792-26e5-471c-92ac-73c60131bab8&ccId=19000101_000001&lang=fr_CA
21 +- **Secteurs** : Immobilier, Gestion immobilière
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-adp.md`](ats-adp.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `CCID` | `19000101_000001` |
33 +| `CID` | `47d4e792-26e5-471c-92ac-73c60131bab8` |
34 +| `EMPLOYER` | `MSI Gestion immobilière` |
35 +| `LANG` | `fr_CA` |
36 +- **Throttle** : 1.0 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 100 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 83 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 17 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *400-Technicien(ne) comptable* — Québec · 25$/hre) · parue le 2026-05-18.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_ADP_DETAIL_LIMIT` | `80` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 6/6 actives (100 %)
83 +- **GPS** : 6/6 actives (100 %)
84 +- **Mode** : 0/6 actives (0 %)
85 +- **Parution** : 6/6 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync msi_gestion` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='msi_gestion' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez MSI Gestion immobilière » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/msi_gestion.py` :
111 +
112 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/mthreerecruitingportal.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mthreerecruitingportal.md
7 +Rôle : Fiche connecteur — mthree (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# mthree (`mthreerecruitingportal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/mthreerecruitingportal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [mthree]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/mthreerecruitingportal
21 +- **Secteurs** : TI, Placement
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `mthreerecruitingportal` |
33 +| `EMPLOYER` | `mthree` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **22 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 23 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 86 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 95 % |
61 +
62 +Exemple réel : *KYC Analyst* — Montréal · ∅ · parue le 2026-08-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 22 (dont **22 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/22 actives (0 %)
76 +- **GPS** : 21/22 actives (95 %)
77 +- **Mode** : 5/22 actives (23 %)
78 +- **Parution** : 22/22 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 22, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mthreerecruitingportal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mthreerecruitingportal' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez mthree » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/mthreerecruitingportal.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/mxo.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/mxo.md
7 +Rôle : Fiche connecteur — MXO (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# MXO (`mxo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/mxo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [MXO](https://mxoconseil.com)
20 +- **Page carrières** : https://mxo.bamboohr.com/careers
21 +- **Secteurs** : manufacturier/commerce
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `MXO` |
33 +| `ORG` | `mxo` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 67 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
61 +
62 +Exemple réel : *Développeur·e Full Stack* — Québec · 70 080 $ - 105 120$ · parue le 2026-07-22.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 6/6 actives (100 %)
81 +- **GPS** : 0/6 actives (0 %)
82 +- **Mode** : 0/6 actives (0 %)
83 +- **Parution** : 6/6 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync mxo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='mxo' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez MXO » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/mxo.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/national.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/national.md
7 +Rôle : Fiche connecteur — NATIONAL (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# NATIONAL (`national`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/national.py`
16 +
17 +## Description
18 +
19 +- **Site** : [NATIONAL]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/national
21 +- **Secteurs** : Relations publiques
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `national` |
33 +| `EMPLOYER` | `NATIONAL` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Conseiller(ère), Relations médias, positionnement corporatif et produits (Remplacement de …* — Montréal · ∅ · parue le 2026-06-02.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/1 actives (0 %)
76 +- **GPS** : 1/1 actives (100 %)
77 +- **Mode** : 0/1 actives (0 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync national` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='national' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez NATIONAL » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/national.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/nexapp.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/nexapp.md
7 +Rôle : Fiche connecteur — Nexapp (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Nexapp (`nexapp`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/nexapp.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Nexapp]()
20 +- **Page carrières** : https://nexapp.bamboohr.com/careers
21 +- **Secteurs** : TI, Web
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Nexapp` |
33 +| `ORG` | `nexapp` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 67 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Designer de produit senior.e* — Québec · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/6 actives (0 %)
81 +- **GPS** : 6/6 actives (100 %)
82 +- **Mode** : 0/6 actives (0 %)
83 +- **Parution** : 6/6 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync nexapp` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nexapp' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Nexapp » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/nexapp.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/no_saint.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/no_saint.md
7 +Rôle : Fiche connecteur — No Saint (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# No Saint (`no_saint`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/no_saint.py`
16 +
17 +## Description
18 +
19 +- **Site** : [No Saint]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/no-saint
21 +- **Secteurs** : Création
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `No Saint` |
33 +| `ORG` | `no-saint` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 67 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Office Manager* — Montréal · ∅ · parue le 2026-07-23.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/3 actives (0 %)
76 +- **GPS** : 3/3 actives (100 %)
77 +- **Mode** : 3/3 actives (100 %)
78 +- **Parution** : 3/3 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 3, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync no_saint` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='no_saint' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez No Saint » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/no_saint.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/nomic.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/nomic.md
7 +Rôle : Fiche connecteur — Nomic Bio (employeur direct, ATS ashby)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Nomic Bio (`nomic`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`ashby`](ats-ashby.md) · Statut registre : actif · Connecteur : `jobka/connectors/nomic.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Nomic Bio]()
20 +- **Page carrières** : https://jobs.ashbyhq.com/nomic
21 +- **Secteurs** : Biotechnologie
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-ashby.md`](ats-ashby.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Nomic Bio` |
33 +| `ORG` | `nomic` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 75 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 75 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 75 % |
61 +
62 +Exemple réel : *Profiling Lab Operations Associate* — Montréal · ∅ · parue le 2026-08-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/4 actives (0 %)
76 +- **GPS** : 3/4 actives (75 %)
77 +- **Mode** : 4/4 actives (100 %)
78 +- **Parution** : 4/4 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 4, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync nomic` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nomic' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Nomic Bio » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/nomic.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/nora_pharma.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/nora_pharma.md
7 +Rôle : Fiche connecteur — Nora Pharma (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Nora Pharma (`nora_pharma`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/nora_pharma.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Nora Pharma]()
20 +- **Page carrières** : https://nora-pharma.breezy.hr
21 +- **Secteurs** : Pharmaceutique
22 +- **Région** : Laval, Montréal, Granby
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Nora Pharma` |
33 +| `ORG` | `nora-pharma` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **9 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 89 % |
61 +
62 +Exemple réel : *Technicien(ne) en pharmacie* — Granby · $35 – $40 / hour · parue le 2026-08-04.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 9 (dont **9 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 9/9 actives (100 %)
76 +- **GPS** : 8/9 actives (89 %)
77 +- **Mode** : 0/9 actives (0 %)
78 +- **Parution** : 9/9 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 9, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync nora_pharma` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nora_pharma' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Nora Pharma » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/nora_pharma.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/northwestrubber.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/northwestrubber.md
7 +Rôle : Fiche connecteur — North West Rubber (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# North West Rubber (`northwestrubber`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/northwestrubber.py`
16 +
17 +## Description
18 +
19 +- **Site** : [North West Rubber]()
20 +- **Page carrières** : https://northwestrubber.bamboohr.com/careers
21 +- **Secteurs** : Manufacture
22 +- **Région** : Sherbrooke
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `North West Rubber` |
33 +| `ORG` | `northwestrubber` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 83 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Superviseur de production - Quart de soir* — Québec · À discuter selon expérience · parue le 2026-05-20.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/6 actives (0 %)
81 +- **GPS** : 6/6 actives (100 %)
82 +- **Mode** : 0/6 actives (0 %)
83 +- **Parution** : 6/6 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync northwestrubber` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='northwestrubber' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez North West Rubber » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/northwestrubber.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/novipro.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/novipro.md
7 +Rôle : Fiche connecteur — NOVIPRO (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# NOVIPRO (`novipro`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/novipro.py`
16 +
17 +## Description
18 +
19 +- **Site** : [NOVIPRO]()
20 +- **Page carrières** : https://novipro.breezy.hr
21 +- **Secteurs** : TI
22 +- **Région** : Montréal, Longueuil
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `NOVIPRO` |
33 +| `ORG` | `novipro` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **17 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 18 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 76 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Architecte d'entreprise* — Québec · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 17 (dont **17 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/17 actives (0 %)
76 +- **GPS** : 17/17 actives (100 %)
77 +- **Mode** : 3/17 actives (18 %)
78 +- **Parution** : 17/17 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 17, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync novipro` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='novipro' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez NOVIPRO » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/novipro.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/nuovophotography.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/nuovophotography.md
7 +Rôle : Fiche connecteur — Nuovo Photography (employeur direct, ATS workable)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Nuovo Photography (`nuovophotography`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workable`](ats-workable.md) · Statut registre : actif · Connecteur : `jobka/connectors/nuovophotography.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Nuovo Photography]()
20 +- **Page carrières** : https://apply.workable.com/nuovophotography
21 +- **Secteurs** : Photographie
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workable.md`](ats-workable.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Nuovo Photography` |
33 +| `ORG` | `nuovophotography` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 88 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 12 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 12 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 38 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 25 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Professionnelle de l'expérience client et de la vente - Montréal* — Montréal · Rémunération concurrentielle: Un salaire de base de 25,00 $ CAD par heure, jumelé à une st… · parue le 2026-05-20.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/8 actives (12 %)
76 +- **GPS** : 8/8 actives (100 %)
77 +- **Mode** : 0/8 actives (0 %)
78 +- **Parution** : 8/8 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 8, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync nuovophotography` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nuovophotography' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Nuovo Photography » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/nuovophotography.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/omni_hotels_gestion.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/omni_hotels_gestion.md
7 +Rôle : Fiche connecteur — Omni Hôtel Mont-Royal (employeur direct, ATS icims)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Omni Hôtel Mont-Royal (`omni_hotels_gestion`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`icims`](ats-icims.md) · Statut registre : actif · Connecteur : `jobka/connectors/omni_hotels_gestion.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Omni Hôtel Mont-Royal](https://www.omnihotels.com/fr/hotels/montreal-mont-royal)
20 +- **Page carrières** : https://externalmanager-omnihotels.icims.com/jobs/search?ss=1
21 +- **Secteurs** : Hôtellerie, Gestion
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-icims.md`](ats-icims.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Omni Hôtel Mont-Royal` |
33 +| `SUB` | `externalmanager-omnihotels` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 100 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 50 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 38 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Chef tournant* — Montréal · 59 $/heure · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_ICIMS_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 8 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 4/8 actives (50 %)
81 +- **GPS** : 8/8 actives (100 %)
82 +- **Mode** : 0/8 actives (0 %)
83 +- **Parution** : 8/8 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 8, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync omni_hotels_gestion` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='omni_hotels_gestion' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Omni Hôtel Mont-Royal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/omni_hotels_gestion.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/omni_hotels_horaire.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/omni_hotels_horaire.md
7 +Rôle : Fiche connecteur — Omni Hôtel Mont-Royal (employeur direct, ATS icims)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Omni Hôtel Mont-Royal (`omni_hotels_horaire`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`icims`](ats-icims.md) · Statut registre : actif · Connecteur : `jobka/connectors/omni_hotels_horaire.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Omni Hôtel Mont-Royal](https://www.omnihotels.com/fr/hotels/montreal-mont-royal)
20 +- **Page carrières** : https://externalhourly-omnihotels.icims.com/jobs/search?ss=1
21 +- **Secteurs** : Hôtellerie, Restauration
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-icims.md`](ats-icims.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Omni Hôtel Mont-Royal` |
33 +| `SUB` | `externalhourly-omnihotels` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 100 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 50 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 50 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 100 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 38 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Chef tournant* — Montréal · 59 $/heure · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_ICIMS_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 8 (dont **8 actives**, 8 masquées comme doublons `dup_of`)
80 +- **Salaire** : 4/8 actives (50 %)
81 +- **GPS** : 8/8 actives (100 %)
82 +- **Mode** : 0/8 actives (0 %)
83 +- **Parution** : 8/8 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 8, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync omni_hotels_horaire` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='omni_hotels_horaire' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Omni Hôtel Mont-Royal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/omni_hotels_horaire.py` :
109 +
110 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/onrunning.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/onrunning.md
7 +Rôle : Fiche connecteur — On Running (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# On Running (`onrunning`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/onrunning.py`
16 +
17 +## Description
18 +
19 +- **Site** : [On Running]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/onrunning
21 +- **Secteurs** : Commerce de détail, Sport
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `onrunning` |
33 +| `EMPLOYER` | `On Running` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 50 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Spécialiste – Représentant(e) Technique, Québec* — Montréal · ∅ · parue le 2026-08-03.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/2 actives (0 %)
76 +- **GPS** : 2/2 actives (100 %)
77 +- **Mode** : 0/2 actives (0 %)
78 +- **Parution** : 2/2 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 2, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync onrunning` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='onrunning' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez On Running » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/onrunning.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/opalrt.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/opalrt.md
7 +Rôle : Fiche connecteur — OPAL-RT Technologies (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# OPAL-RT Technologies (`opalrt`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/opalrt.py`
16 +
17 +## Description
18 +
19 +- **Site** : [OPAL-RT Technologies]()
20 +- **Page carrières** : https://opalrt.bamboohr.com/careers
21 +- **Secteurs** : TI, Ingénierie
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `OPAL-RT Technologies` |
33 +| `ORG` | `opalrt` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **14 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 21 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 43 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Analyste en Modélisation et Simulation Électrique / Electrical Modeling and Simulation Ana…* — Montréal · ∅ · parue le 2026-08-13.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 14 (dont **14 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/14 actives (0 %)
81 +- **GPS** : 14/14 actives (100 %)
82 +- **Mode** : 0/14 actives (0 %)
83 +- **Parution** : 14/14 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 14, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync opalrt` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='opalrt' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez OPAL-RT Technologies » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/opalrt.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/osedea.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/osedea.md
7 +Rôle : Fiche connecteur — OSEDEA (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# OSEDEA (`osedea`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/osedea.py`
16 +
17 +## Description
18 +
19 +- **Site** : [OSEDEA]()
20 +- **Page carrières** : https://jobs.lever.co/osedea
21 +- **Secteurs** : TI, Web
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `OSEDEA` |
33 +| `ORG` | `osedea` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **18 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 89 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Designer de produits senior* — Montréal · ∅ · parue le 2026-05-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 18 (dont **18 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/18 actives (0 %)
76 +- **GPS** : 18/18 actives (100 %)
77 +- **Mode** : 18/18 actives (100 %)
78 +- **Parution** : 18/18 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 18, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync osedea` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='osedea' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez OSEDEA » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/osedea.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/ott.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/ott.md
7 +Rôle : Fiche connecteur — OTT Financial (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# OTT Financial (`ott`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/ott.py`
16 +
17 +## Description
18 +
19 +- **Site** : [OTT Financial]()
20 +- **Page carrières** : https://ott.bamboohr.com/careers
21 +- **Secteurs** : Finance
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `OTT Financial` |
33 +| `ORG` | `ott` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Account Manager (Mandarin) - Montreal* — Montréal · ∅ · parue le 2025-06-16.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/2 actives (0 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync ott` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ott' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez OTT Financial » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/ott.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/peoplecanfly.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/peoplecanfly.md
7 +Rôle : Fiche connecteur — People Can Fly (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# People Can Fly (`peoplecanfly`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/peoplecanfly.py`
16 +
17 +## Description
18 +
19 +- **Site** : [People Can Fly]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/PeopleCanFly
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `PeopleCanFly` |
33 +| `EMPLOYER` | `People Can Fly` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **8 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Artiste de niveau senior/Senior Level Artist - Remote, Canada* — Montréal · ∅ · parue le 2026-08-18.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 10 (dont **8 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/8 actives (0 %)
81 +- **GPS** : 8/8 actives (100 %)
82 +- **Mode** : 8/8 actives (100 %)
83 +- **Parution** : 8/8 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 8, +0, ~0, -1
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync peoplecanfly` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='peoplecanfly' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez People Can Fly » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/peoplecanfly.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/petalmd.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/petalmd.md
7 +Rôle : Fiche connecteur — Petal (employeur direct, ATS recruitee)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Petal (`petalmd`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`recruitee`](ats-recruitee.md) · Statut registre : actif · Connecteur : `jobka/connectors/petalmd.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Petal]()
20 +- **Page carrières** : https://petalmd.recruitee.com
21 +- **Secteurs** : TI, Santé
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-recruitee.md`](ats-recruitee.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Petal` |
33 +| `ORG` | `petalmd` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **7 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 100 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 14 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 71 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Director of GTM Systems & Architecture* — Montréal · ∅ · parue le 2026-08-13.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 7 (dont **7 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/7 actives (14 %)
76 +- **GPS** : 7/7 actives (100 %)
77 +- **Mode** : 7/7 actives (100 %)
78 +- **Parution** : 7/7 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 7, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync petalmd` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='petalmd' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Petal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/petalmd.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/pfizer.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/pfizer.md
7 +Rôle : Fiche connecteur — Pfizer Canada (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Pfizer Canada (`pfizer`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/pfizer.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Pfizer Canada]()
20 +- **Page carrières** : https://pfizer.wd1.myworkdayjobs.com/PfizerCareers
21 +- **Secteurs** : Pharmaceutique
22 +- **Région** : Kirkland
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Pfizer Canada` |
33 +| `HOST` | `wd1` |
34 +| `SITE` | `PfizerCareers` |
35 +| `TENANT` | `pfizer` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 0 % |
50 +| `region` — Région | région administrative | 0 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 25 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
63 +
64 +Exemple réel : *Global Development Lead, Internal Medicine (MD, Sr. Director)* — ∅ · 00 to $457,500 · parue le 2026-08-13.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 5 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 4/4 actives (100 %)
83 +- **GPS** : 0/4 actives (0 %)
84 +- **Mode** : 0/4 actives (0 %)
85 +- **Parution** : 4/4 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 4, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 14
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync pfizer` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='pfizer' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Pfizer Canada » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/pfizer.py` :
111 +
112 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/playmind.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/playmind.md
7 +Rôle : Fiche connecteur — Playmind (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Playmind (`playmind`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/playmind.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Playmind]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/playmind
21 +- **Secteurs** : Jeux vidéo
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `playmind` |
33 +| `EMPLOYER` | `Playmind` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Developer C++ Unreal (Inter or Senior)* — Montréal · ∅ · parue le 2019-09-05.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/2 actives (0 %)
81 +- **GPS** : 2/2 actives (100 %)
82 +- **Mode** : 0/2 actives (0 %)
83 +- **Parution** : 2/2 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 2, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync playmind` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='playmind' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Playmind » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/playmind.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/plusgrade.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/plusgrade.md
7 +Rôle : Fiche connecteur — Plusgrade (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Plusgrade (`plusgrade`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/plusgrade.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Plusgrade](https://plusgrade.com)
20 +- **Page carrières** : https://plusgrade.wd10.myworkdayjobs.com/Plusgrade_External_Site
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Plusgrade` |
33 +| `HOST` | `wd10` |
34 +| `SITE` | `Plusgrade_External_Site` |
35 +| `TENANT` | `plusgrade` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Software Developer* — Montréal · ∅ · parue le 2026-07-31.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 4 (dont **4 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/4 actives (0 %)
83 +- **GPS** : 4/4 actives (100 %)
84 +- **Mode** : 0/4 actives (0 %)
85 +- **Parution** : 4/4 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 4, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync plusgrade` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='plusgrade' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Plusgrade » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/plusgrade.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/poka.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/poka.md
7 +Rôle : Fiche connecteur — Poka (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Poka (`poka`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/poka.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Poka](https://www.poka.io)
20 +- **Page carrières** : https://job-boards.greenhouse.io/poka
21 +- **Secteurs** : TI, SaaS manufacturier
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `poka` |
33 +| `EMPLOYER` | `Poka` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Frontend Developer* — Montréal · ∅ · parue le 2026-08-05.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/5 actives (0 %)
76 +- **GPS** : 5/5 actives (100 %)
77 +- **Mode** : 0/5 actives (0 %)
78 +- **Parution** : 5/5 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 5, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync poka` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='poka' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Poka » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/poka.py` :
104 +
105 +- `1fc94ac` 2026-08-17 Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
added docs/connecteurs/portagecybertech.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/portagecybertech.md
7 +Rôle : Fiche connecteur — Portage CyberTech (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Portage CyberTech (`portagecybertech`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/portagecybertech.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Portage CyberTech]()
20 +- **Page carrières** : https://portagecybertech.bamboohr.com/careers
21 +- **Secteurs** : TI, Cybersécurité
22 +- **Région** : Gatineau, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Portage CyberTech` |
33 +| `ORG` | `portagecybertech` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **6 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 67 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 17 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 17 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 50 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Spécialiste DevOps / DevOps Specialist* — Québec · $75,000 - $90,000 · parue le 2026-08-06.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 6 (dont **6 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 1/6 actives (17 %)
81 +- **GPS** : 6/6 actives (100 %)
82 +- **Mode** : 4/6 actives (67 %)
83 +- **Parution** : 6/6 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 6, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync portagecybertech` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='portagecybertech' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Portage CyberTech » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/portagecybertech.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/potloc.md +109 −0
@@ -0,0 +1,109 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/potloc.md
7 +Rôle : Fiche connecteur — Potloc (employeur direct, ATS lever)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Potloc (`potloc`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`lever`](ats-lever.md) · Statut registre : actif · Connecteur : `jobka/connectors/potloc.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Potloc](https://www.potloc.com)
20 +- **Page carrières** : https://jobs.lever.co/Potloc
21 +- **Secteurs** : TI, Études de marché
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-lever.md`](ats-lever.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Potloc` |
33 +| `ORG` | `Potloc` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 50 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Développeur Full Stack Senior / Senior Full Stack Developer 🇨🇦* — Montréal · ∅ · parue le 2026-06-01.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 2 (dont **2 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/2 actives (0 %)
76 +- **GPS** : 2/2 actives (100 %)
77 +- **Mode** : 2/2 actives (100 %)
78 +- **Parution** : 2/2 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 2, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 16
81 +
82 +## Erreurs & dépannage
83 +
84 +Erreurs relevées dans `sync_log` :
85 +
86 +| Erreur | Occurrences | Dernière fois |
87 +|---|---|---|
88 +| HTTPSConnectionPool(host='api.lever.co', port=443): Max retries exceeded with url: /v0/pos… | 1 | 2026-08-17 20:44 |
89 +
90 +- Rejouer un sync isolé : `.venv/bin/python run.py sync potloc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='potloc' ORDER BY ts DESC LIMIT 5;"`
91 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
92 +
93 +## Licence / conformité
94 +
95 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Potloc » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
96 +
97 +## Historique
98 +
99 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
100 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
101 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
102 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
103 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
104 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
105 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
106 +
107 +Commits touchant `jobka/connectors/potloc.py` :
108 +
109 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/pouletrouge.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/pouletrouge.md
7 +Rôle : Fiche connecteur — Poulet Rouge (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Poulet Rouge (`pouletrouge`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/pouletrouge.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Poulet Rouge](https://poulet-rouge.ca)
20 +- **Page carrières** : https://pouletrouge.bamboohr.com/careers
21 +- **Secteurs** : restauration
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Poulet Rouge` |
33 +| `ORG` | `pouletrouge` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
61 +
62 +Exemple réel : *Adjoint·e au Vice-président, Développement des franchises* — Québec · ∅ · parue le 2026-08-10.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/1 actives (0 %)
81 +- **GPS** : 0/1 actives (0 %)
82 +- **Mode** : 0/1 actives (0 %)
83 +- **Parution** : 1/1 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 1, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync pouletrouge` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='pouletrouge' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Poulet Rouge » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/pouletrouge.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/promutuel.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/promutuel.md
7 +Rôle : Fiche connecteur — Promutuel Assurance (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Promutuel Assurance (`promutuel`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/promutuel.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Promutuel Assurance](https://promutuelassurance.ca)
20 +- **Page carrières** : https://promutuel.wd3.myworkdayjobs.com/promutuel_carrieres
21 +- **Secteurs** : n/d
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Promutuel Assurance` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `promutuel_carrieres` |
35 +| `TENANT` | `promutuel` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **37 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 16 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 97 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 95 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Analyste de risque en assurance des particuliers* — Joliette · ∅ · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 38 (dont **37 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/37 actives (0 %)
83 +- **GPS** : 37/37 actives (100 %)
84 +- **Mode** : 6/37 actives (16 %)
85 +- **Parution** : 37/37 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 37, +0, ~0, -1
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync promutuel` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='promutuel' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Promutuel Assurance » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/promutuel.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/qsl.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/qsl.md
7 +Rôle : Fiche connecteur — QSL (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# QSL (`qsl`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/qsl.py`
16 +
17 +## Description
18 +
19 +- **Site** : [QSL](https://qsl.com)
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/qsl
21 +- **Secteurs** : n/d
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `qsl` |
33 +| `EMPLOYER` | `QSL` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **37 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 38 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 38 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 92 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Contremaître portuaire* — Québec · e procurant une rémunération totale pouvant atteindre entre 80 000$ et 110 000$ par année; · parue le 2026-08-07.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 37 (dont **37 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 14/37 actives (38 %)
81 +- **GPS** : 37/37 actives (100 %)
82 +- **Mode** : 0/37 actives (0 %)
83 +- **Parution** : 37/37 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 37, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 3
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync qsl` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='qsl' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez QSL » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/qsl.py` :
109 +
110 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/rcgt.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/rcgt.md
7 +Rôle : Fiche connecteur — Raymond Chabot Grant Thornton (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Raymond Chabot Grant Thornton (`rcgt`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/rcgt.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Raymond Chabot Grant Thornton](https://rcgt.com)
20 +- **Page carrières** : https://rcgt.wd3.myworkdayjobs.com/External
21 +- **Secteurs** : n/d
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Raymond Chabot Grant Thornton` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `External` |
35 +| `TENANT` | `rcgt` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 20 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Chargée ou chargé de dossiers* — Québec · ∅ · parue le 2026-08-13.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/5 actives (0 %)
83 +- **GPS** : 5/5 actives (100 %)
84 +- **Mode** : 1/5 actives (20 %)
85 +- **Parution** : 5/5 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 5, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync rcgt` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='rcgt' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Raymond Chabot Grant Thornton » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/rcgt.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/reitmanscanadalteltd.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/reitmanscanadalteltd.md
7 +Rôle : Fiche connecteur — Reitmans (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Reitmans (`reitmanscanadalteltd`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/reitmanscanadalteltd.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Reitmans]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/ReitmansCanadaLteLtd
21 +- **Secteurs** : Commerce de détail, Mode
22 +- **Région** : Montréal, Québec, Laval
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `ReitmansCanadaLteLtd` |
33 +| `EMPLOYER` | `Reitmans` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **142 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 31 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 22 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 22 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 98 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Gérant.e adjoint.e - Mega Centre Sainte Foy* — Québec · Salaire: 45 500$ - 54 000$ (le taux peut être plus élevé en foncti · parue le 2026-08-12.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 144 (dont **142 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 31/142 actives (22 %)
81 +- **GPS** : 142/142 actives (100 %)
82 +- **Mode** : 44/142 actives (31 %)
83 +- **Parution** : 142/142 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 142, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync reitmanscanadalteltd` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='reitmanscanadalteltd' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Reitmans » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/reitmanscanadalteltd.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/reseau_mieux_etre.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/reseau_mieux_etre.md
7 +Rôle : Fiche connecteur — Réseau Mieux-Être (employeur direct, ATS breezy)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Réseau Mieux-Être (`reseau_mieux_etre`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`breezy`](ats-breezy.md) · Statut registre : actif · Connecteur : `jobka/connectors/reseau_mieux_etre.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Réseau Mieux-Être]()
20 +- **Page carrières** : https://reseau-mieux-etre.breezy.hr
21 +- **Secteurs** : Santé
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-breezy.md`](ats-breezy.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Réseau Mieux-Être` |
33 +| `ORG` | `reseau-mieux-etre` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **15 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 13 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Infirmier(ère) auxiliaire– Clinique St-Laurent* — Montréal · ∅ · parue le 2026-08-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 15 (dont **15 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 0/15 actives (0 %)
76 +- **GPS** : 15/15 actives (100 %)
77 +- **Mode** : 2/15 actives (13 %)
78 +- **Parution** : 15/15 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 15, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync reseau_mieux_etre` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='reseau_mieux_etre' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Réseau Mieux-Être » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/reseau_mieux_etre.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/rethinkcanada.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/rethinkcanada.md
7 +Rôle : Fiche connecteur — Rethink (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Rethink (`rethinkcanada`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/rethinkcanada.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Rethink]()
20 +- **Page carrières** : https://rethinkcanada.bamboohr.com/careers
21 +- **Secteurs** : Publicité
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Rethink` |
33 +| `ORG` | `rethinkcanada` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **3 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 0 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Directeur.trice-conseil* — Montréal · ∅ · parue le 2026-05-21.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 3 (dont **3 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/3 actives (0 %)
81 +- **GPS** : 3/3 actives (100 %)
82 +- **Mode** : 0/3 actives (0 %)
83 +- **Parution** : 3/3 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 3, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync rethinkcanada` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='rethinkcanada' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Rethink » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/rethinkcanada.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/riotinto.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/riotinto.md
7 +Rôle : Fiche connecteur — Rio Tinto (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Rio Tinto (`riotinto`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/riotinto.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Rio Tinto]()
20 +- **Page carrières** : https://riotinto.wd3.myworkdayjobs.com/riotinto_careers
21 +- **Secteurs** : Mines
22 +- **Région** : Saguenay, Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Rio Tinto` |
33 +| `HOST` | `wd3` |
34 +| `SITE` | `riotinto_careers` |
35 +| `TENANT` | `riotinto` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **23 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 4 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 39 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Ingénieur(e) de maintenance* — Sorel-Tracy · ∅ · parue le 2026-08-17.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 23 (dont **23 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 0/23 actives (0 %)
83 +- **GPS** : 23/23 actives (100 %)
84 +- **Mode** : 1/23 actives (4 %)
85 +- **Parution** : 23/23 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 23, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync riotinto` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='riotinto' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Rio Tinto » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/riotinto.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/robotiq.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/robotiq.md
7 +Rôle : Fiche connecteur — Robotiq (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Robotiq (`robotiq`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/robotiq.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Robotiq]()
20 +- **Page carrières** : https://robotiq.bamboohr.com/careers
21 +- **Secteurs** : Robotique, Manufacture
22 +- **Région** : Lévis
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Robotiq` |
33 +| `ORG` | `robotiq` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **7 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 86 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 86 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Développeur.se Web Fullstack (Angular)* — Québec · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 7 (dont **7 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/7 actives (0 %)
81 +- **GPS** : 7/7 actives (100 %)
82 +- **Mode** : 0/7 actives (0 %)
83 +- **Parution** : 7/7 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 7, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync robotiq` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='robotiq' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Robotiq » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/robotiq.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/rodeofx.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/rodeofx.md
7 +Rôle : Fiche connecteur — Rodeo FX (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Rodeo FX (`rodeofx`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/rodeofx.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Rodeo FX]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/RodeoFX
21 +- **Secteurs** : Effets visuels, Création
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `RodeoFX` |
33 +| `EMPLOYER` | `Rodeo FX` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **20 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 10 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 15 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *FX Artist - Mid and Senior - Multiple Positions* — Montréal · ∅ · parue le 2026-08-17.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_SR_DETAIL_LIMIT` | `300` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 20 (dont **20 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/20 actives (0 %)
81 +- **GPS** : 20/20 actives (100 %)
82 +- **Mode** : 2/20 actives (10 %)
83 +- **Parution** : 20/20 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 20, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync rodeofx` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='rodeofx' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Rodeo FX » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/rodeofx.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/rtc_quebec.md +116 −0
@@ -0,0 +1,116 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/rtc_quebec.md
7 +Rôle : Fiche connecteur — Réseau de transport de la Capitale (employeur direct, ATS njoyn)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Réseau de transport de la Capitale (`rtc_quebec`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`njoyn`](ats-njoyn.md) · Statut registre : actif · Connecteur : `jobka/connectors/rtc_quebec.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Réseau de transport de la Capitale](https://www.rtcquebec.ca)
20 +- **Page carrières** : https://rtc.njoyn.com/CGI/xweb/xweb.asp?clid=23009&page=joblisting&lang=2
21 +- **Secteurs** : Transport collectif, Secteur public
22 +- **Région** : Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-njoyn.md`](ats-njoyn.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://rtc.njoyn.com` |
33 +| `CL` | `CGI` |
34 +| `CLID` | `23009` |
35 +| `EMPLOYER` | `Réseau de transport de la Capitale` |
36 +| `LANG` | `2` |
37 +| `USE_SCRAPFLY` | `True` |
38 +- **Throttle** : 1.2 s entre requêtes.
39 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
40 +
41 +## Champs → schéma
42 +
43 +Complétude mesurée sur les **19 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
44 +
45 +| Champ (`jobs.*`) | Rôle | Complétude |
46 +|---|---|---|
47 +| `title` — Titre | titre du poste | 100 % |
48 +| `employer` — Employeur | nom de l'entreprise | 100 % |
49 +| `url` — URL | lien direct vers l'offre originale | 100 % |
50 +| `description` — Description | texte complet (HTML nettoyé) | 32 % |
51 +| `city` — Ville | municipalité normalisée | 0 % |
52 +| `region` — Région | région administrative | 0 % |
53 +| `address` — Adresse | adresse du lieu de travail | 0 % |
54 +| `postal_code` — Code postal | code postal si publié | 0 % |
55 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
56 +| `employment_type` — Type | temps_plein / temps_partiel / … | 16 % |
57 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
58 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
59 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
60 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
61 +| `date_posted` — Date de parution | ISO 8601 | 0 % |
62 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
63 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 42 % |
64 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
65 +
66 +Exemple réel : *Coordonnateur – évolutions technologiques* — ∅ · ∅ · parue le ∅.
67 +
68 +## Fréquence & budgets
69 +
70 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
71 +- **Throttle** : 1.2 s minimum entre deux requêtes vers la source (`request_delay`).
72 +- **Budgets / plafonds (variables d'environnement)** :
73 +
74 +| Variable | Défaut |
75 +|---|---|
76 +| `JOBKA_NJOYN_DETAIL_LIMIT` | `40` |
77 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
78 +
79 +## Volumétrie & complétude live
80 +
81 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
82 +
83 +- **Offres en base** : 19 (dont **19 actives**, 0 masquées comme doublons `dup_of`)
84 +- **Salaire** : 0/19 actives (0 %)
85 +- **GPS** : 0/19 actives (0 %)
86 +- **Mode** : 0/19 actives (0 %)
87 +- **Parution** : 0/19 actives (0 %)
88 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 19, +0, ~0, -0
89 +- **Syncs enregistrés** (`sync_log`) : 3
90 +
91 +## Erreurs & dépannage
92 +
93 +Aucune erreur dans `sync_log` pour cette source.
94 +
95 +- Rejouer un sync isolé : `.venv/bin/python run.py sync rtc_quebec` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='rtc_quebec' ORDER BY ts DESC LIMIT 5;"`
96 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
97 +
98 +## Licence / conformité
99 +
100 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Réseau de transport de la Capitale » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
101 +
102 +Certains domaines de cette plateforme sont servis derrière un gestionnaire anti-bot : la lecture passe alors par Scrapfly, toujours sur des pages strictement publiques, au même rythme throttlé.
103 +
104 +## Historique
105 +
106 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
107 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
108 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
109 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
110 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
111 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
112 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
113 +
114 +Commits touchant `jobka/connectors/rtc_quebec.py` :
115 +
116 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/samsara.md +105 −0
@@ -0,0 +1,105 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/samsara.md
7 +Rôle : Fiche connecteur — Samsara (employeur direct, ATS greenhouse)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Samsara (`samsara`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`greenhouse`](ats-greenhouse.md) · Statut registre : actif · Connecteur : `jobka/connectors/samsara.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Samsara]()
20 +- **Page carrières** : https://job-boards.greenhouse.io/samsara
21 +- **Secteurs** : TI, IoT
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-greenhouse.md`](ats-greenhouse.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BOARD` | `samsara` |
33 +| `EMPLOYER` | `Samsara` |
34 +- **Throttle** : 1.0 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Mid-Market Account Executive - French Fluent* — Montréal · Typical sales will be $20k to $100k, and involve POCs, multiple stakeho · parue le 2026-05-14.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 1.0 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
69 +
70 +## Volumétrie & complétude live
71 +
72 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
73 +
74 +- **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
75 +- **Salaire** : 1/1 actives (100 %)
76 +- **GPS** : 1/1 actives (100 %)
77 +- **Mode** : 1/1 actives (100 %)
78 +- **Parution** : 1/1 actives (100 %)
79 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 1, +0, ~0, -0
80 +- **Syncs enregistrés** (`sync_log`) : 15
81 +
82 +## Erreurs & dépannage
83 +
84 +Aucune erreur dans `sync_log` pour cette source.
85 +
86 +- Rejouer un sync isolé : `.venv/bin/python run.py sync samsara` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='samsara' ORDER BY ts DESC LIMIT 5;"`
87 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
88 +
89 +## Licence / conformité
90 +
91 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Samsara » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
92 +
93 +## Historique
94 +
95 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
96 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
97 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
98 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
99 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
100 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
101 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
102 +
103 +Commits touchant `jobka/connectors/samsara.py` :
104 +
105 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/sante_montreal.md +116 −0
@@ -0,0 +1,116 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/sante_montreal.md
7 +Rôle : Fiche connecteur — Santé Québec — Montréal (employeur direct, ATS njoyn)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Santé Québec — Montréal (`sante_montreal`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`njoyn`](ats-njoyn.md) · Statut registre : actif · Connecteur : `jobka/connectors/sante_montreal.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Santé Québec — Montréal](https://santemontreal.ca)
20 +- **Page carrières** : https://emplois.santemontreal.qc.ca/CL3/xweb/xweb.asp?clid=54327&page=joblisting&lang=2
21 +- **Secteurs** : Santé, Services sociaux, Secteur public
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-njoyn.md`](ats-njoyn.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://emplois.santemontreal.qc.ca` |
33 +| `CL` | `CL3` |
34 +| `CLID` | `54327` |
35 +| `EMPLOYER` | `Santé Québec — Montréal` |
36 +| `LANG` | `2` |
37 +| `USE_SCRAPFLY` | `False` |
38 +- **Throttle** : 1.2 s entre requêtes.
39 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
40 +
41 +## Champs → schéma
42 +
43 +Complétude mesurée sur les **50 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
44 +
45 +| Champ (`jobs.*`) | Rôle | Complétude |
46 +|---|---|---|
47 +| `title` — Titre | titre du poste | 100 % |
48 +| `employer` — Employeur | nom de l'entreprise | 100 % |
49 +| `url` — URL | lien direct vers l'offre originale | 100 % |
50 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
51 +| `city` — Ville | municipalité normalisée | 100 % |
52 +| `region` — Région | région administrative | 96 % |
53 +| `address` — Adresse | adresse du lieu de travail | 0 % |
54 +| `postal_code` — Code postal | code postal si publié | 0 % |
55 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
56 +| `employment_type` — Type | temps_plein / temps_partiel / … | 48 % |
57 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 98 % |
58 +| `salary_label` — Libellé salaire | texte salarial original | 100 % |
59 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
60 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % |
61 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
62 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
63 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 92 % |
64 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
65 +
66 +Exemple réel : *Chef de service - aide à domicile - secteur Pointe-Aux-Trembles (Intérim)* — Montréal · 96770 $ - 125799 $ Annuelle · parue le 2026-08-18.
67 +
68 +## Fréquence & budgets
69 +
70 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
71 +- **Throttle** : 1.2 s minimum entre deux requêtes vers la source (`request_delay`).
72 +- **Budgets / plafonds (variables d'environnement)** :
73 +
74 +| Variable | Défaut |
75 +|---|---|
76 +| `JOBKA_NJOYN_DETAIL_LIMIT` | `40` |
77 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
78 +
79 +## Volumétrie & complétude live
80 +
81 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
82 +
83 +- **Offres en base** : 50 (dont **50 actives**, 0 masquées comme doublons `dup_of`)
84 +- **Salaire** : 49/50 actives (98 %)
85 +- **GPS** : 50/50 actives (100 %)
86 +- **Mode** : 0/50 actives (0 %)
87 +- **Parution** : 50/50 actives (100 %)
88 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 50, +0, ~0, -0
89 +- **Syncs enregistrés** (`sync_log`) : 4
90 +
91 +## Erreurs & dépannage
92 +
93 +Aucune erreur dans `sync_log` pour cette source.
94 +
95 +- Rejouer un sync isolé : `.venv/bin/python run.py sync sante_montreal` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='sante_montreal' ORDER BY ts DESC LIMIT 5;"`
96 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
97 +
98 +## Licence / conformité
99 +
100 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Santé Québec — Montréal » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
101 +
102 +Certains domaines de cette plateforme sont servis derrière un gestionnaire anti-bot : la lecture passe alors par Scrapfly, toujours sur des pages strictement publiques, au même rythme throttlé.
103 +
104 +## Historique
105 +
106 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
107 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
108 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
109 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
110 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
111 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
112 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
113 +
114 +Commits touchant `jobka/connectors/sante_montreal.py` :
115 +
116 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/sante_quebec.md +111 −0
@@ -0,0 +1,111 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/sante_quebec.md
7 +Rôle : Fiche connecteur — Santé Québec (employeur direct, ATS digitalrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Santé Québec (`sante_quebec`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`digitalrecruiters`](ats-digitalrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/sante_quebec.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Santé Québec](https://sante.quebec)
20 +- **Page carrières** : https://emplois.sante.quebec
21 +- **Secteurs** : Santé, Secteur public, Administration
22 +- **Région** : Montréal, Québec
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-digitalrecruiters.md`](ats-digitalrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `BASE` | `https://emplois.sante.quebec` |
33 +| `EMPLOYER` | `Santé Québec` |
34 +| `LOCALE` | `fr_CA` |
35 +- **Throttle** : 0.8 s entre requêtes.
36 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
37 +
38 +## Champs → schéma
39 +
40 +Complétude mesurée sur les **49 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
41 +
42 +| Champ (`jobs.*`) | Rôle | Complétude |
43 +|---|---|---|
44 +| `title` — Titre | titre du poste | 100 % |
45 +| `employer` — Employeur | nom de l'entreprise | 100 % |
46 +| `url` — URL | lien direct vers l'offre originale | 100 % |
47 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
48 +| `city` — Ville | municipalité normalisée | 47 % |
49 +| `region` — Région | région administrative | 47 % |
50 +| `address` — Adresse | adresse du lieu de travail | 59 % |
51 +| `postal_code` — Code postal | code postal si publié | 18 % |
52 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
53 +| `employment_type` — Type | temps_plein / temps_partiel / … | 2 % |
54 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 98 % |
55 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
56 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
57 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
58 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
59 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
60 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
61 +| `gps` — GPS | lat/lng (géocodage sans invention) | 61 % |
62 +
63 +Exemple réel : *Technicien(ne) en administration BCNPQS* — Montréal · ∅ · parue le 2026-08-14.
64 +
65 +## Fréquence & budgets
66 +
67 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
68 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
69 +- **Budgets / plafonds (variables d'environnement)** :
70 +
71 +| Variable | Défaut |
72 +|---|---|
73 +| `JOBKA_DR_DETAIL_LIMIT` | `120` |
74 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
75 +
76 +## Volumétrie & complétude live
77 +
78 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
79 +
80 +- **Offres en base** : 49 (dont **49 actives**, 0 masquées comme doublons `dup_of`)
81 +- **Salaire** : 48/49 actives (98 %)
82 +- **GPS** : 30/49 actives (61 %)
83 +- **Mode** : 0/49 actives (0 %)
84 +- **Parution** : 49/49 actives (100 %)
85 +- **Dernier sync** : 2026-08-18 11:27 — trouvées 49, +0, ~0, -0
86 +- **Syncs enregistrés** (`sync_log`) : 4
87 +
88 +## Erreurs & dépannage
89 +
90 +Aucune erreur dans `sync_log` pour cette source.
91 +
92 +- Rejouer un sync isolé : `.venv/bin/python run.py sync sante_quebec` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='sante_quebec' ORDER BY ts DESC LIMIT 5;"`
93 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
94 +
95 +## Licence / conformité
96 +
97 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Santé Québec » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
98 +
99 +## Historique
100 +
101 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
102 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
103 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
104 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
105 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
106 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
107 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
108 +
109 +Commits touchant `jobka/connectors/sante_quebec.py` :
110 +
111 +- `4917d57` 2026-08-18 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
added docs/connecteurs/saputo.md +116 −0
@@ -0,0 +1,116 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/saputo.md
7 +Rôle : Fiche connecteur — Saputo (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Saputo (`saputo`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/saputo.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Saputo](https://www.saputo.com)
20 +- **Page carrières** : https://saputo.wd5.myworkdayjobs.com/Saputo_External_Careers
21 +- **Secteurs** : Agroalimentaire, Production
22 +- **Région** : Montréal / province
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Saputo` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `Saputo_External_Careers` |
35 +| `TENANT` | `saputo` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **25 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 80 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 80 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 64 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
63 +
64 +Exemple réel : *Internal Auditor* — Montréal · Salary Range: From 68,630$ to 90,080$ (+ business allowance) · parue le 2026-08-14.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 25 (dont **25 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 20/25 actives (80 %)
83 +- **GPS** : 25/25 actives (100 %)
84 +- **Mode** : 0/25 actives (0 %)
85 +- **Parution** : 25/25 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:28 — trouvées 26, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 16
88 +
89 +## Erreurs & dépannage
90 +
91 +Erreurs relevées dans `sync_log` :
92 +
93 +| Erreur | Occurrences | Dernière fois |
94 +|---|---|---|
95 +| HTTPSConnectionPool(host='saputo.wd5.myworkdayjobs.com', port=443): Read timed out. (read … | 1 | 2026-08-17 20:42 |
96 +
97 +- Rejouer un sync isolé : `.venv/bin/python run.py sync saputo` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='saputo' ORDER BY ts DESC LIMIT 5;"`
98 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
99 +
100 +## Licence / conformité
101 +
102 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Saputo » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
103 +
104 +## Historique
105 +
106 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
107 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
108 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
109 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
110 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
111 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
112 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
113 +
114 +Commits touchant `jobka/connectors/saputo.py` :
115 +
116 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/scalia.md +110 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/scalia.md
7 +Rôle : Fiche connecteur — Propriétés Scalia (employeur direct, ATS bamboohr)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Propriétés Scalia (`scalia`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`bamboohr`](ats-bamboohr.md) · Statut registre : actif · Connecteur : `jobka/connectors/scalia.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Propriétés Scalia]()
20 +- **Page carrières** : https://scalia.bamboohr.com/careers
21 +- **Secteurs** : Immobilier
22 +- **Région** : Montréal, Anjou
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-bamboohr.md`](ats-bamboohr.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Propriétés Scalia` |
33 +| `ORG` | `scalia` |
34 +- **Throttle** : 0.8 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 20 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |
60 +| `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
61 +
62 +Exemple réel : *Coordonnateur de propriété - Property Coordinator* — Québec · ∅ · parue le 2026-08-13.
63 +
64 +## Fréquence & budgets
65 +
66 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
67 +- **Throttle** : 0.8 s minimum entre deux requêtes vers la source (`request_delay`).
68 +- **Budgets / plafonds (variables d'environnement)** :
69 +
70 +| Variable | Défaut |
71 +|---|---|
72 +| `JOBKA_BHR_DETAIL_LIMIT` | `150` |
73 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
74 +
75 +## Volumétrie & complétude live
76 +
77 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
78 +
79 +- **Offres en base** : 5 (dont **5 actives**, 0 masquées comme doublons `dup_of`)
80 +- **Salaire** : 0/5 actives (0 %)
81 +- **GPS** : 5/5 actives (100 %)
82 +- **Mode** : 1/5 actives (20 %)
83 +- **Parution** : 5/5 actives (100 %)
84 +- **Dernier sync** : 2026-08-18 11:28 — trouvées 5, +0, ~0, -0
85 +- **Syncs enregistrés** (`sync_log`) : 15
86 +
87 +## Erreurs & dépannage
88 +
89 +Aucune erreur dans `sync_log` pour cette source.
90 +
91 +- Rejouer un sync isolé : `.venv/bin/python run.py sync scalia` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='scalia' ORDER BY ts DESC LIMIT 5;"`
92 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
93 +
94 +## Licence / conformité
95 +
96 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Propriétés Scalia » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
97 +
98 +## Historique
99 +
100 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
101 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
102 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
103 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
104 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
105 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
106 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
107 +
108 +Commits touchant `jobka/connectors/scalia.py` :
109 +
110 +- `4657429` 2026-08-17 Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
added docs/connecteurs/scottsmiraclegro.md +112 −0
@@ -0,0 +1,112 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/scottsmiraclegro.md
7 +Rôle : Fiche connecteur — Scotts Canada (Fafard) (employeur direct, ATS workday)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# Scotts Canada (Fafard) (`scottsmiraclegro`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/scottsmiraclegro.py`
16 +
17 +## Description
18 +
19 +- **Site** : [Scotts Canada (Fafard)](https://scottsmiraclegro.com)
20 +- **Page carrières** : https://scottsmiraclegro.wd5.myworkdayjobs.com/SMGExternal
21 +- **Secteurs** : manufacturier/commerce
22 +- **Région** :
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `EMPLOYER` | `Scotts Canada (Fafard)` |
33 +| `HOST` | `wd5` |
34 +| `SITE` | `SMGExternal` |
35 +| `TENANT` | `scottsmiraclegro` |
36 +- **Throttle** : 0.7 s entre requêtes.
37 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
38 +
39 +## Champs → schéma
40 +
41 +Complétude mesurée sur les **27 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
42 +
43 +| Champ (`jobs.*`) | Rôle | Complétude |
44 +|---|---|---|
45 +| `title` — Titre | titre du poste | 100 % |
46 +| `employer` — Employeur | nom de l'entreprise | 100 % |
47 +| `url` — URL | lien direct vers l'offre originale | 100 % |
48 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
49 +| `city` — Ville | municipalité normalisée | 100 % |
50 +| `region` — Région | région administrative | 100 % |
51 +| `address` — Adresse | adresse du lieu de travail | 0 % |
52 +| `postal_code` — Code postal | code postal si publié | 0 % |
53 +| `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
55 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 4 % |
56 +| `salary_label` — Libellé salaire | texte salarial original | 4 % |
57 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
58 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
59 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
60 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
61 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 85 % |
62 +| `gps` — GPS | lat/lng (géocodage sans invention) | 0 % |
63 +
64 +Exemple réel : *Technicien en électromécanique / Electromechanical Technician* — St Bonaventure · A partie de 28,99$ de l'heure · parue le 2026-07-19.
65 +
66 +## Fréquence & budgets
67 +
68 +- **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources.
69 +- **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`).
70 +- **Budgets / plafonds (variables d'environnement)** :
71 +
72 +| Variable | Défaut |
73 +|---|---|
74 +| `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` |
75 +- Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change.
76 +
77 +## Volumétrie & complétude live
78 +
79 +*(mesuré le 2026-08-18 11:37 EDT dans `data/jobka.db`)*
80 +
81 +- **Offres en base** : 27 (dont **27 actives**, 0 masquées comme doublons `dup_of`)
82 +- **Salaire** : 1/27 actives (4 %)
83 +- **GPS** : 0/27 actives (0 %)
84 +- **Mode** : 0/27 actives (0 %)
85 +- **Parution** : 27/27 actives (100 %)
86 +- **Dernier sync** : 2026-08-18 11:28 — trouvées 27, +0, ~0, -0
87 +- **Syncs enregistrés** (`sync_log`) : 3
88 +
89 +## Erreurs & dépannage
90 +
91 +Aucune erreur dans `sync_log` pour cette source.
92 +
93 +- Rejouer un sync isolé : `.venv/bin/python run.py sync scottsmiraclegro` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='scottsmiraclegro' ORDER BY ts DESC LIMIT 5;"`
94 +- Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`.
95 +
96 +## Licence / conformité
97 +
98 +**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Scotts Canada (Fafard) » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.
99 +
100 +## Historique
101 +
102 +**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :
103 +- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
104 +- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
105 +- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
106 +- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
107 +- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
108 +- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).
109 +
110 +Commits touchant `jobka/connectors/scottsmiraclegro.py` :
111 +
112 +- `5a66f48` 2026-08-18 Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
added docs/connecteurs/servicenow.md +59 −0
@@ -0,0 +1,110 @@
1 +<!--
2 +=============================================================================
3 +Job·Ka — Groupe KA
4 +Auteur : Simon-Pierre Boucher
5 +Contact : contact@spboucher.ai
6 +Fichier : docs/connecteurs/servicenow.md
7 +Rôle : Fiche connecteur — ServiceNow (employeur direct, ATS smartrecruiters)
8 +Généré : 2026-08-18 11:37 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 + relancer le script pour régénérer.
10 +=============================================================================
11 +-->
12 +
13 +# ServiceNow (`servicenow`)
14 +
15 +**Employeur direct** · Plateforme ATS : [`smartrecruiters`](ats-smartrecruiters.md) · Statut registre : actif · Connecteur : `jobka/connectors/servicenow.py`
16 +
17 +## Description
18 +
19 +- **Site** : [ServiceNow]()
20 +- **Page carrières** : https://jobs.smartrecruiters.com/company/ServiceNow
21 +- **Secteurs** : TI, SaaS
22 +- **Région** : Montréal
23 +- Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire.
24 +
25 +## Accès
26 +
27 +- **Mécanique** : voir la fiche plateforme [`ats-smartrecruiters.md`](ats-smartrecruiters.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme).
28 +- **Identifiants du tenant** (attributs du connecteur) :
29 +
30 +| Attribut | Valeur |
31 +|---|---|
32 +| `COMPANY` | `ServiceNow` |
33 +| `EMPLOYER` | `ServiceNow` |
34 +- **Throttle** : 0.7 s entre requêtes.
35 +- **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client).
36 +
37 +## Champs → schéma
38 +
39 +Complétude mesurée sur les **2 offres actives** de la source (base live, 2026-08-18 11:37 EDT).
40 +
41 +| Champ (`jobs.*`) | Rôle | Complétude |
42 +|---|---|---|
43 +| `title` — Titre | titre du poste | 100 % |
44 +| `employer` — Employeur | nom de l'entreprise | 100 % |
45 +| `url` — URL | lien direct vers l'offre originale | 100 % |
46 +| `description` — Description | texte complet (HTML nettoyé) | 100 % |
47 +| `city` — Ville | municipalité normalisée | 100 % |
48 +| `region` — Région | région administrative | 100 % |
49 +| `address` — Adresse | adresse du lieu de travail | 0 % |
50 +| `postal_code` — Code postal | code postal si publié | 0 % |
51 +| `work_mode` — Mode | presentiel / hybride / teletravail | 100 % |
52 +| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
53 +| `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
54 +| `salary_label` — Libellé salaire | texte salarial original | 0 % |
55 +| `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
56 +| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 0 % |
57 +| `date_posted` — Date de parution | ISO 8601 | 100 % |
58 +| `date_deadline` — Date limite | date limite pour postuler | 0 % |
59 +| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 100 % |

Diff truncated — file too large.