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 | Contact : contact@spboucher.ai | 5 | Contact : contact@spboucher.ai | ||
| 6 | Fichier : README.md | 6 | Fichier : README.md | ||
| 7 | Rôle : Documentation principale du projet | 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 | **[www.job-ka.com](https://www.job-ka.com)** | 18 | **[www.job-ka.com](https://www.job-ka.com)** | ||
| 19 | 19 | ||||
| 20 | *Job·Ka collecte les offres directement sur les pages carrières des employeurs | 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, | 21 | +du Québec — 217 employeurs branchés sur 17 plateformes ATS, complétés par | ||
| 22 | −les salaires sont normalisés en $/h et $/an, et la candidature se fait chez | 22 | +3 portails publics (l'offre directe gagne toujours). Chaque offre est | ||
| 23 | −l'employeur. Zéro boîte noire, zéro intermédiaire.* | 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 | </div> | 26 | </div> | ||
| 26 | 27 | ||||
@@ -31,6 +32,7 @@ l'employeur. Zéro boîte noire, zéro intermédiaire.* | |||||
| 31 | - [Pourquoi Job·Ka ?](#pourquoi-job-ka-) | 32 | - [Pourquoi Job·Ka ?](#pourquoi-job-ka-) | ||
| 32 | - [L'architecture en 30 secondes](#larchitecture-en-30-secondes) | 33 | - [L'architecture en 30 secondes](#larchitecture-en-30-secondes) | ||
| 33 | - [Le pipeline en détail](#le-pipeline-en-détail) | 34 | - [Le pipeline en détail](#le-pipeline-en-détail) | ||
| 35 | +- [Connecteurs](#connecteurs) | ||||
| 34 | - [Structure du dépôt](#structure-du-dépôt) | 36 | - [Structure du dépôt](#structure-du-dépôt) | ||
| 35 | - [Démarrage rapide](#démarrage-rapide) | 37 | - [Démarrage rapide](#démarrage-rapide) | ||
| 36 | - [CLI `run.py`](#cli-runpy) | 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 | est la seule source fiable : à jour, complète, sans frais de mise en avant. | 53 | est la seule source fiable : à jour, complète, sans frais de mise en avant. | ||
| 52 | 54 | ||||
| 53 | > Job·Ka se branche directement sur les systèmes de recrutement (ATS) des | 55 | > Job·Ka se branche directement sur les systèmes de recrutement (ATS) des | ||
| 54 | −> employeurs : Workday, Lever, Greenhouse, SmartRecruiters, ou leur site | 56 | +> employeurs — 17 plateformes : Workday, Lever, Greenhouse, SmartRecruiters, | ||
| 55 | −> maison. Un connecteur = un employeur. Le tout resynchronisé jour et nuit. | 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 | Ce n'est pas un job board qui vend de la visibilité, c'est un index fidèle de | 61 | Ce n'est pas un job board qui vend de la visibilité, c'est un index fidèle de | ||
| 58 | ce que les employeurs québécois affichent réellement — **avec les salaires en | 62 | ce que les employeurs québécois affichent réellement — **avec les salaires en | ||
@@ -92,11 +96,10 @@ flowchart LR | |||||
| 92 | 96 | ||||
| 93 | ### Connecteurs auto-découverts | 97 | ### Connecteurs auto-découverts | ||
| 94 | Toute sous-classe de `BaseConnector` avec un `source_id` est enregistrée par | 98 | Toute sous-classe de `BaseConnector` avec un `source_id` est enregistrée par | ||
| 95 | −`pkgutil` — aucun registre à maintenir. Les plateformes ATS (Workday, Lever, | 99 | +`pkgutil` — aucun registre à maintenir. Les 17 plateformes ATS sont des | ||
| 96 | −Greenhouse, SmartRecruiters) sont des classes de base : brancher un nouvel | 100 | +classes de base : brancher un nouvel employeur = ~10 lignes. Politesse : | ||
| 97 | −employeur = ~10 lignes. Politesse : throttling par source (`request_delay`), | 101 | +throttling par source (`request_delay`), User-Agent identifiable | ||
| 98 | −User-Agent identifiable `JobKaBot/1.0`, budgets de requêtes, cache BD des | 102 | +`JobKaBot/1.0`, budgets de requêtes, cache BD des pages détail. | ||
| 99 | −pages détail. | ||||
| 100 | 103 | ||||
| 101 | ### Diff engine avec garde-fou anti-dérive | 104 | ### Diff engine avec garde-fou anti-dérive | ||
| 102 | Chaque sync compare le `content_hash` de chaque offre : ajout, mise à jour, ou | 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 | canonique est la source la plus autoritaire (page carrière avant agrégat) ; | 126 | canonique est la source la plus autoritaire (page carrière avant agrégat) ; | ||
| 124 | les doublons sont masqués (`dup_of`), jamais supprimés. | 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 | ## Structure du dépôt | 151 | ## Structure du dépôt | ||
| 127 | 152 | ||||
| 128 | ``` | 153 | ``` | ||
@@ -141,15 +166,15 @@ job-ka/ | |||||
| 141 | │ └── connectors/ | 166 | │ └── connectors/ | ||
| 142 | │ ├── base.py # BaseConnector (throttling, Scrapfly, cache détail) | 167 | │ ├── base.py # BaseConnector (throttling, Scrapfly, cache détail) | ||
| 143 | │ ├── workday.py # plateforme Workday (facette Québec auto-découverte) | 168 | │ ├── workday.py # plateforme Workday (facette Québec auto-découverte) | ||
| 144 | −│ ├── lever.py # plateforme Lever | 169 | +│ ├── <ats>.py # 16 autres plateformes ATS partagées | ||
| 145 | −│ ├── greenhouse.py # plateforme Greenhouse | 170 | +│ ├── guichet_emplois.py # + jobillico.py, espresso_jobs.py : portails | ||
| 146 | −│ ├── smartrecruiters.py # plateforme SmartRecruiters | 171 | +│ └── <employeur>.py # 1 fichier = 1 employeur (sous-classe ~10 lignes) | ||
| 147 | −│ └── <employeur>.py # 1 fichier = 1 employeur (sous-classe) | 172 | +├── data/sources.json # registre descriptif des sources (221 entrées) | ||
| 148 | −├── data/sources.json # registre descriptif des employeurs | ||||
| 149 | ├── frontend/ # React 18 + Vite + TS (carte MapLibre, sans jeton) | 173 | ├── frontend/ # React 18 + Vite + TS (carte MapLibre, sans jeton) | ||
| 150 | ├── tests/ # pytest : normalisation + rejeu des connecteurs | 174 | ├── tests/ # pytest : normalisation + rejeu des connecteurs | ||
| 151 | ├── scripts/check_headers.py # hook pre-commit : en-tête d'auteur obligatoire | 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 | ## Démarrage rapide | 180 | ## Démarrage rapide | ||
@@ -194,6 +219,7 @@ En dev frontend : `npm run dev` dans `frontend/` (proxy `/api` → :8096). | |||||
| 194 | | `SCRAPFLY_API_KEY` | rendu JS / anti-bot pour les pages carrières maison | | 219 | | `SCRAPFLY_API_KEY` | rendu JS / anti-bot pour les pages carrières maison | | ||
| 195 | | `JOBKA_WORKDAY_DETAIL_LIMIT` | plafond de pages détail Workday par sync (défaut 300) | | 220 | | `JOBKA_WORKDAY_DETAIL_LIMIT` | plafond de pages détail Workday par sync (défaut 300) | | ||
| 196 | | `JOBKA_SR_DETAIL_LIMIT` | plafond de pages détail SmartRecruiters (défaut 300) | | 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 | ## API | 224 | ## API | ||
| 199 | 225 | ||||
@@ -207,6 +233,7 @@ En dev frontend : `npm run dev` dans `frontend/` (proxy `/api` → :8096). | |||||
| 207 | | `GET /api/sources` | registre des employeurs + fraîcheur par source | | 233 | | `GET /api/sources` | registre des employeurs + fraîcheur par source | | ||
| 208 | | `GET /api/stats` | totaux, catégories, villes, dernières syncs | | 234 | | `GET /api/stats` | totaux, catégories, villes, dernières syncs | | ||
| 209 | | `POST /api/sync` | déclenche une synchronisation (webhook) | | 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 | ## Ajouter un employeur (≈ 10 lignes) | 238 | ## Ajouter un employeur (≈ 10 lignes) | ||
| 212 | 239 | ||||
modified
data/sources.json
+27 −1
@@ -3,7 +3,33 @@ | |||||
| 3 | "project": "Job·Ka — Groupe KA", | 3 | "project": "Job·Ka — Groupe KA", | ||
| 4 | "author": "Simon-Pierre Boucher <contact@spboucher.ai>", | 4 | "author": "Simon-Pierre Boucher <contact@spboucher.ai>", | ||
| 5 | "role": "Registre descriptif des sources (alimente la page Sources)", | 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 | "sources": [ | 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
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/amilia.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/anciapersonnelinc.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/appdirect.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/astucemedia.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/atecna_montreal.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-adp.md
+63 −0
Large diff (63 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-ashby.md
+71 −0
Large diff (71 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-bamboohr.md
+94 −0
Large diff (94 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-breezy.md
+71 −0
Large diff (71 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-digitalrecruiters.md
+57 −0
Large diff (57 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-greenhouse.md
+77 −0
Large diff (77 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-icims.md
+64 −0
Large diff (64 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-lever.md
+76 −0
Large diff (76 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-njoyn.md
+69 −0
Large diff (69 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-recruitee.md
+69 −0
Large diff (69 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-smartrecruiters.md
+89 −0
Large diff (89 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-successfactors.md
+61 −0
Large diff (61 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-taleo.md
+69 −0
Large diff (69 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-ultipro.md
+61 −0
Large diff (61 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-workable.md
+78 −0
Large diff (78 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-workday.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ats-workland.md
+57 −0
Large diff (57 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/autodesk.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/aviyatech.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bardel_entertainment.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bayshore.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bc2.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bdc.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bell_textron.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/beneva.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bhvr.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bigbang.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/biximontreal.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bmo.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/bombardier.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/botpress.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/brandmomentum.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/broadsign.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/broccolini.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/caaquebec.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cae.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/canada_global.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/canadiantirecorporation.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/capreit.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cascades.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cdpq.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cfmontreal.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/charger_logistics_inc.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/churchdwight.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cibc.md
+116 −0
Large diff (116 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cima2.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/circlek.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cirquedusoleil.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ciusss_est_montreal.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cogeco.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cohere.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cordonbleu.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/cssdm.md
+106 −0
Large diff (106 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/dcbel.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/depot-direct.md
+67 −0
Large diff (67 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/desjardins.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/devimco.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/dilitrust.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/distro.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/domtar.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/dulcedo.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/edf_renouvelables.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/emcocorporation.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/eminent_valet.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/eosaircraftinc.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/eq3_ltd.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/eqbank.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/espresso_jobs.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/evlo.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/evolving_web.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/exfo.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/explorance.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/fenetresconcept.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/flare.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/flinks.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/fondsftq.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/framestore.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/fuse.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gameloft.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gearboxquebec.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/genetec_inc.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gfs.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gologic.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gorh.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/groupecanam.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gsk.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/guichet_emplois.md
+122 −0
Large diff (122 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/gurussolutions.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/hopper.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/hoyoverse.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/huaweicanada.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ia_groupe.md
+117 −0
Large diff (117 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/industrious.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ino_ca.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/intactfc.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/investpsp.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/investquebec.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/jexcelleinc.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/jgrivesud.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/jobillico.md
+119 −0
Large diff (119 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/korem.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/kpidigital.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/labelink.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lamour.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lassonde.md
+89 −0
Large diff (89 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/levio.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lg2.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lidd.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lightspeedhq.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/logisco.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/lush.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/maintainx.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/manulife.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mattelinc.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mccarthy_tetrault.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mcgill.md
+113 −0
Large diff (113 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mckesson.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/medfar.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/medialo.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/messer_canada.md
+115 −0
Large diff (115 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/microhabitat.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mila_2.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mirego.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mistplay.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mistral_ai.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mitacs.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mitsubishi_hc_capital.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/msi_gestion.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mthreerecruitingportal.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/mxo.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/national.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/nexapp.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/no_saint.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/nomic.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/nora_pharma.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/northwestrubber.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/novipro.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/nuovophotography.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/omni_hotels_gestion.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/omni_hotels_horaire.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/onrunning.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/opalrt.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/osedea.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/ott.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/peoplecanfly.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/petalmd.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/pfizer.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/playmind.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/plusgrade.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/poka.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/portagecybertech.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/potloc.md
+109 −0
Large diff (109 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/pouletrouge.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/promutuel.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/qsl.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/rcgt.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/reitmanscanadalteltd.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/reseau_mieux_etre.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/rethinkcanada.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/riotinto.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/robotiq.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/rodeofx.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/rtc_quebec.md
+116 −0
Large diff (116 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/samsara.md
+105 −0
Large diff (105 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/sante_montreal.md
+116 −0
Large diff (116 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/sante_quebec.md
+111 −0
Large diff (111 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/saputo.md
+116 −0
Large diff (116 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/scalia.md
+110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/scottsmiraclegro.md
+112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
added
docs/connecteurs/servicenow.md
+59 −0
Large diff (59 lines) is not loaded by default to keep the page fast.Load diff
Diff truncated — file too large.