# sgiq — Société de Gestion Immobilière du Québec (SGIQ / Amiral) - site: https://gestionimmobilierequebec.com/immeubles (+ fiches /fiche/ et endpoint AJAX /mod/act_p/ImmeubleAct.php) - méthode: html + json-api (endpoint carte getMarkers) - annonces: 147 → 147 - couverture après (sur 147 annonces): prix 100%, adresse 100%, dispo 99%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Liste paginée (7 pages) : titre/adresse, localité, catégorie, prix, image vignette. - Endpoint JSON `POST ImmeubleAct.php a=getMarkers&form=dispo=` : **lat/lng structurés** (129/147, les autres fiches n'ont pas de marqueur exploitable) + type d'unité structuré (« 3-1-2 » → 3½) pour toutes les fiches. - Fiches détail : description complète (bloc gauche seulement, sans mélanger les items techniques), commodités (« Chauffé : Oui », « Éclairé : Non », « 1 chambre », « 1 salle de bain », « 1 stationnement », « Chiens permis »), images (jusqu'à 30), **pets structuré** depuis l'icône animal dédiée (oui : 131, non : 16), secteur (« QUARTIER SAINTE-FOY »), disponibilité (« DISPONIBLE PRÉSENTEMENT », « PRÉSENTEMENT DISPONIBLE », « DISPONIBLE EN JUILLET », « Prise de possession flexible »). - Téléphone dans la description → contact dérivé par finalize(). ## Champs indisponibles à la source - Superficie (pi²) : jamais publiée (ni liste, ni fiche, ni JSON). - Meublé : non exposé. - Adresse postale complète avec code postal : seulement dans certains titres. ## Fragilités - La disponibilité vit uniquement dans le texte libre de la description (MAJUSCULES, tirets variables) — regex tolérante mais un nouveau phrasé peut échapper. - Le cache détail est calé sur titre+prix+catégorie de la carte liste : si SGIQ modifie seulement la description (ex. nouvelle date de dispo) sans toucher le prix, la fiche ne sera pas re-téléchargée avant le prochain changement de prix. - Endpoint AJAX non documenté (`ImmeubleAct.php`) : peut changer sans préavis ; le connecteur le traite en best-effort (try/except, aucun champ obligatoire n'en dépend). ## Améliorations apportées - **Cache BD des fiches** via `self.detail()` (clé = hash titre|prix|catégorie) + plafond `max_fetch_per_sync=160` de vraies requêtes (exception `_FetchBudget` pour ne jamais mettre en cache un payload vide) : sync passe de ~83 s (147 GET) à ~4 s quand rien n'a changé. - **lat/lng** (0 % → 88 %) et type d'unité structuré via l'endpoint carte getMarkers (1 seul POST). - **pets** (0 % → 100 %) depuis l'icône « Chiens permis » (img icon_animal), avec négation (« non/refusé/interdit ») → "non". - **Disponibilité** 31 % → 99 % : ajout de « PRÉSENTEMENT », ordre inversé (« PRÉSENTEMENT DISPONIBLE »), « EN » sans année (alternation de mois FR). - Description plus propre : bloc gauche de « Description et remarques » seulement (les items « Chauffé : Oui » restent dans amenities). ## Échantillon avant/après - 751-C avenue Myrand (3½, 948 $) — avant : dispo « », availability_date NULL, pets NULL, lat NULL. Après : dispo « Disponible présentement » → `now`, pets `oui`, lat 46.79107/-71.27273. - 905-1G rue Liénard (4½, 1148 $) — avant : dispo vide ; après : « Disponible présentement » → `now`, pets `oui`, coordonnées présentes. - Studios Limoilou « DISPONIBLE EN JUILLET » — avant non capté ; après dispo « Disponible en juillet » → date ISO du 1er juillet à venir. ## Lacune générique de normalisation (à traiter dans normalize.py, non contournée ici) - `_PETS_YES_RE` ne reconnaît pas « Chiens permis » / « CHIEN ACCEPTÉ » (singulier + « permis » non couverts) — ici compensé par l'icône structurée de la source, mais d'autres sources texte-seulement en profiteraient.