← Tous les manuels · Portail

MANUAL — mercado-inmobiliario (Dashboard marché immo)

À LIRE avant toute intervention, à METTRE À JOUR après (CHANGELOG en bas).
Créé 2026-09-13.

1. Identité

  • - Rôle : dashboard d'analyse du marché immobilier d'Asunción/Paraguay (ventes vs locations), alimenté par l'observatoire observatoire-immo (Remax, Brokers, Century 21, Sotheby's).
  • - URL : https://mercado.panelbay.com (Cloudflare DNS + nginx + Let's Encrypt).
  • - Entité : MOA (charte MOA : vert #012820/#055c4a, crème #f3efe6, Fraunces + Inter).
  • 2. Exécution / infra

  • - Dossier : /root/workspace/apps/mercado-inmobiliario/ (index.html + data.json).
  • - Service : systemd mercado-inmobiliario.service = python3 -m http.server 8137 sur ce dossier. systemctl restart mercado-inmobiliario pour relancer.
  • - nginx : /etc/nginx/sites-enabled/mercado.panelbay.com.conf (proxy 127.0.0.1:8137).
  • - Données : data.json (6,3 Mo) régénéré depuis observatoire.db par ../observatoire-immo/scripts/build_dashboard_data.py. À rebrancher sur le cron de nuit (après run_daily.sh) pour un rafraîchissement quotidien.
  • 3. Front (index.html)

  • - Statique, Chart.js via CDN, filtrage 100% côté client sur data.json.
  • - 2 onglets Ventes / Locations. Filtres : agence, type (catégorie), quartier (multi), chambres, origine (neuf/occasion), livraison (pozo/livré), prix min/max, période de transactions.
  • - KPIs, 6 graphiques (prix/m² par quartier, transactions/mois, distribution, délai, origine, mois d'écoulement / rendement), table de classement triable.
  • - Rendement locatif brut = loyer médian /m² ×12 / prix vente médian /m² du même quartier.
  • 4. Pièges

  • - data.json volumineux : envisager gzip nginx si lenteur.
  • - Le resolver local de la VPS peut cacher un NXDOMAIN après création DNS ; sans impact pour les clients externes (vérifier via nslookup <fqdn> 1.1.1.1).
  • - origine/livraison viennent de la passe vision Remax (en cours au 13/09) : partiels sur les autres sources.
  • 5. CHANGELOG

  • - 2026-09-14 (soir) : Couverture quartiers Asunción à 98,1 %. data.json régénéré après attribution des quartiers manquants par kNN sur coordonnées (voir ../observatoire-immo changelog 2026-09-14 soir). +709 annonces d'Asunción gagnent un quartier ; le drill-down Ville > Quartier couvre maintenant 51 barrios exploitables pour les apparts en vente (Las Lomas, Ycuá Satí, Recoleta, Villa Morra, Herrera...). Rendu vérifié headless jusqu'au niveau quartier : 0 erreur JS.
  • - 2026-09-14 : Drill-down géographique + métriques fiabilisées. data.json régénéré depuis les colonnes normalisées de la DB (voir ../observatoire-immo changelog 2026-09-14) : 23 338 lignes propres (actives + vendues + louées, inactives/disparues exclues), 4,6 Mo. Le dashboard consomme maintenant la hiérarchie Département > Ville > Quartier (meta.geo) : 3 filtres en cascade (choisir un département filtre les villes, choisir une ville filtre les quartiers) + fil d'Ariane cliquable + zoom au clic sur une ligne du classement. Les médianes de $/m² utilisent eff_usd (prix converti au taux du mois de la vente, corrige le biais guarani) et n'incluent que les ppm2_ok=1 (dans les bornes robustes p02-p98, exclut les aberrantes). Le classement s'ouvre sur les vraies villes (Asunción, Luque, Mariano Roque Alonso...) au lieu des barrios mélangés. Rendu vérifié headless : 0 erreur JS, 6 graphes OK. Le rebuild de data.json est branché dans le cron de nuit (run_daily.sh).
  • - 2026-09-13 (soir 2) : $/m² ne mélange plus les types. Le prix au m² n'étant comparable qu'à l'intérieur d'un type (Luque blendé = $735 alors qu'appart $1387 / maison $708 / terrain $175), le filtre "Type de bien" s'ouvre désormais par défaut sur "appartement", et quand "Tous types" est choisi le $/m² (KPI, colonne classement, graphes ppm2/rendement) est neutralisé (–) avec un bandeau d'avertissement. Prix médian et volumes restent affichés en "Tous types".
  • - 2026-09-13 (soir) : Correctif colonne "Quartier" du classement affichée vide (tous les noms en "–"). Cause : le nom de quartier (chaîne) passait par fmt() dont isNaN("Luque") vaut true, donc "–". La table draw() affiche désormais les valeurs texte telles quelles (les chiffres via usd/fmt). Data.json intact.
  • - 2026-09-13 : Création. Dashboard 2 onglets + filtres + 6 graphes + table, exposé sur mercado.panelbay.com, ajouté au portail.