# lakle — La Klé (Cité Verte) - site: https://lakle.ca/phase-1-occupation-immediate/ (+ /contact pour adresses/coordonnées) - méthode: json-api (sélecteur de plans WP `/wp-json/do-selecteur-plans/v1/unite`) + html (cartes phases 2-3) - annonces: 26 → 46 - couverture après (sur 46 annonces): prix 57%, adresse 100%, dispo 100%, superficie 100%, commodités 100% - fixture: ok · test: ok (2 passed) ## Champs extraits - **Sélecteur de plans (tour phase 4, 26 unités)** : `` (numéro, étage, type, prix) + API JSON par unité : prix (`montant` + `montant_suffixe` « + taxes »), type, **superficie habitable structurée → `area_sqft` explicite** (distincte de la terrasse), superficie terrasse/balcon, style, nb chambres, date libre (`a_partir`), plan PDF, galerie, promotion. `details.floor` depuis `data-etage` (structuré). - **Cartes phases 2 et 3 (nouveau — 20 unités)** : `ul.liste-unite-disponible > li` : nom d'unité (B16, H, C et Ci…), phase, « 1214pi² - 3 chambres » (type + superficie dérivés par finalize), texte marketing, mention « Disponible en octobre / dès maintenant » → availability, photo du plan, PDF. - **Page /contact (nouveau)** : marqueurs Google Map structurés par phase → **adresse civique avec code postal + lat/lng** par phase (phase 4 : Av. Ernest-Gagnon G1S 0E4 ; phase 3 : 475 Ernest-Gagnon ; phase 2 : 1180 Louis-Adolphe Robitaille) — avec repli constant si la page change. - Commodités du complexe (liste « Toutes les unités incluent » de l'accueil, vérifiée) : électroménagers, électricité, chauffage/climatisation centrale, piscine intérieure, salle d'entraînement, toiles solaires, vélos intérieurs, stationnement intérieur en option, interphone, puce d'accès, caméras. ## Champs indisponibles à la source - **Prix des unités phases 2-3** : aucun prix par unité (les tuiles « à partir de 1575$/1945$/2615$ » sont des filtres projet-entiers, pas rattachées à ces unités — non utilisées). → 20/46 sans prix, fidèle à la source. - Politique animaux / fumeur : jamais mentionnée. - Meublé : non mentionné. - Étage des unités phases 2-3 (seulement « en hauteur » en texte libre). ## Fragilités - Le sélecteur de plans est associé à la **phase 4** par déduction (calendly « la-kle-phase-4 », visuels phase-4) alors que l'URL dit « phase-1-occupation-immediate » (slug historique) — à revalider si le site restructure. - `external_id` des cartes = `p-` (ex. `p3-b16`) : stable tant que le nom d'unité ne change pas. - La disponibilité `a_partir` (« Libre le 8 août 2026 ») semble générée avec la date du jour côté serveur → normalisée « now ». - Les cartes sans mention « Disponible … » reçoivent « Disponible » (la section s'intitule « Découvrez nos unités disponibles »). ## Améliorations apportées - **Bug corrigé** : `area_sqft` prenait la superficie de la **terrasse** (finalize prend le min des superficies trouvées dans la description : 161 pi² de balcon < 682 pi² habitables). Désormais `superficie_habitable` structurée de l'API → 100 % correct. - +20 annonces : unités disponibles des phases 2 et 3 (cartes), auparavant totalement ignorées. - Adresse civique réelle + code postal par phase (avant : « Cité Verte, Québec ») et **lat/lng** (avant : géocodage sur adresse vague). - `details.floor` structuré depuis `data-etage`. - Liste des commodités du complexe complétée et vérifiée contre le site (11 items au lieu de 5). ## Échantillon avant/après **La Klé — Unité 103 (3½)** (1845 $) - avant : area_sqft=161 (terrasse !), address=`Cité Verte, Québec`, lat/lng absents, amenities=5 - après : area_sqft=682, address=`Av. Ernest-Gagnon, Québec, G1S 0E4`, lat=46.798431/lng=-71.25187, details.floor=1, amenities=11 **La Klé — Unité B16 (Phase 3)** (nouvelle annonce) - avant : absente - après : unit_type=5½ (3 chambres), area_sqft=1214, availability=`Disponible en octobre en hauteur` → 2026-10-01, address=`475 Ernest-Gagnon, Québec, G1S 0E4`, lat/lng phase 3, plan PDF + photo ## Lacune générique de normalisation détectée - `parse_area_sqft()` retourne le **min** de toutes les superficies d'un texte : quand une description contient l'appartement ET son balcon/terrasse (« Superficie 682 pi² | Balcon 161 pi² »), la terrasse gagne. Un indice de contexte (mots balcon/terrasse à proximité → exclure) éviterait ce piège pour les connecteurs qui n'ont pas de champ structuré.