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>
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 — $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 — $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.