# progim — Gestion Immobilière Progim (plateforme Building Stack) - site: https://progimannonces.bstk.io/Listing/Listings (fragments POST /Listing/ApartmentView) - méthode: json-api (JSON `var units = […]` embarqué + fragments HTML structurés) - annonces: 62 → 62 (65 unités à la source, 3 hors Grand Montréal exclues) - couverture après (sur 62 annonces): prix 100%, adresse 100%, dispo 100%, superficie 66%, commodités 100% - fixture: ok · test: ok ## Champs extraits - JSON liste (déjà : prix, adresse, ville, lat/lng, chambres→unit_type, photos) ; **nouveaux champs structurés** : - `Apartment.Area` → **area_sqft** (0% → 66% ; null à la source pour les 21 restants), - `Apartment.NumberOfBathrooms` → amenity "1 salle de bain"/"2 salles de bains", - `ParkingsIsAvailable` / `StoragesIsAvailable` (booléens plateforme) → `details.parking.available` / `details.storage` (vrai ET faux), - `Building.ListingEmployeesContacts[0]` → `details.contact{phone,email}` (ex. 514-856-7781, mgaron@progim.com). - Fragment ApartmentView : équipements par **clés structurées** `label for=` (HeatingIncluded, HotWaterIncluded, ElectricityIncluded, Furnished, Fridge, Stove, Dishwasher…) → inclusions/appliances/furnished explicites (Oui **et** Non), étage ("Étage" du tableau Général) → `details.floor`, superficie de secours ("Superficie (pi.ca)"), photos, description (div.unit-notes, plus fiable que l'ancienne heuristique find_next), libellés français affichables en amenities. ## Champs indisponibles à la source - Date de disponibilité précise : la plateforme n'affiche que des unités disponibles, sans date ("Disponible" posé, jamais inventé de date). - Animaux, superficie pour 21 unités (Area null), secteur/quartier. ## Fragilités - `var units = [...]` extrait par regex : un changement du bundle JS Building Stack casserait la découverte (mais la plateforme est stable et multi-clients). - Fragments ApartmentView : classes `main-items`/`amentities` (sic) propres à Building Stack. - Photos placeholder relatives (`/Content/Images/apartmenttypes/residential.svg`) désormais filtrées (causait des images non absolues). ## Améliorations apportées - **Migration des fiches vers `self.detail(...)`** (demandé) : le POST ApartmentView n'est refait que si l'unité JSON de la liste a changé (clé = sha1 du blob JSON de l'unité). Sync sans changement : ~55 s → ~1 s ; plafond `max_details=120` vrais POST/sync (compteur dans fetch_fn, hits de cache non comptés). La fixture enregistre bien les POST (63 requêtes, rejeu ok). - area_sqft, salles de bains, parking/rangement, contact, étage, furnished/inclusions/électros structurés (voir ci-dessus). - Parsing du fragment par paires titre/valeur et attributs `for=` au lieu de regex "… Oui$" (les valeurs "Non" sont maintenant captées comme faux structurés au lieu d'être perdues). ## Échantillon avant/après - Avant : `812 Dawson — unité 7 | 1450 | 4½ | Disponible | area=None | details={"inclusions": {"heating": true, "hot_water": true}, "furnished": true}` - Après : `812 Dawson — unité 7 | 1450 | 4½ | Disponible | area=737 | details={"inclusions": {"heating": true, "hot_water": true}, "appliances": {"fridge": true, "stove": true}, "furnished": true, "parking": {"available": false}, "storage": false, "contact": {"phone": "514-856-7781", "email": "mgaron@progim.com"}, "floor": 1}`