Calcul de trajet auto après scrape + recalcul local intelligent

- trajet.py : fonction couts() pure (calcul des coûts sans appel réseau)
- app.py : mémorisation distance/durée/péage + adresses dans le CSV ;
  auto-calcul best-effort après ajout (scrape simple et en lot) ;
  api_distance recalcule en local si adresses inchangées, complet sinon
- index.html : affichage auto du trajet en cache à l'ouverture du prospect
This commit is contained in:
jerem
2026-06-13 17:43:24 +02:00
parent 0952c0bfb5
commit 73d1653225
3 changed files with 113 additions and 18 deletions

View File

@@ -908,13 +908,18 @@ function construireDetail(corps, p) {
trajetBtn.textContent = "🚗 Calculer le trajet";
const resu = document.createElement("div");
resu.className = "trajet-resu";
trajetBtn.addEventListener("click", async () => {
// `silencieux` : affichage auto à l'ouverture (données déjà en cache) — pas de spinner.
async function calculerTrajet(silencieux) {
trajetBtn.disabled = true;
resu.innerHTML = '<span class="spinner sombre"></span> Calcul en cours…';
if (!silencieux) resu.innerHTML = '<span class="spinner sombre"></span> Calcul en cours…';
try {
const rep = await fetch(`/api/distance/${p.index}`);
const d = await rep.json();
if (!rep.ok) { resu.innerHTML = `<span style="color:#b03a2e">${echap(d.message || "Échec du calcul.")}</span>`; return; }
if (!rep.ok) {
// En mode silencieux, on n'affiche pas d'erreur : on laisse simplement le bouton.
if (!silencieux) resu.innerHTML = `<span style="color:#b03a2e">${echap(d.message || "Échec du calcul.")}</span>`;
return;
}
const detailAller = d.peage_aller > 0
? ` <span class="sous">(carburant ${d.carburant_aller} € + péage ${d.peage_aller} €)</span>` : "";
const detailAR = d.peage_aller_retour > 0
@@ -925,13 +930,17 @@ function construireDetail(corps, p) {
`Aller : <strong>${d.cout_aller} €</strong>${detailAller}<br>` +
`Aller-retour : <strong>${d.cout_aller_retour} €</strong>${detailAR} ` +
`<span class="sous">(${d.distance_aller_retour_km} km)</span>`;
trajetBtn.textContent = "🔄 Recalculer le trajet";
} catch {
resu.innerHTML = '<span style="color:#b03a2e">Le serveur ne répond pas.</span>';
if (!silencieux) resu.innerHTML = '<span style="color:#b03a2e">Le serveur ne répond pas.</span>';
} finally {
trajetBtn.disabled = false;
}
});
}
trajetBtn.addEventListener("click", () => calculerTrajet(false));
secTrajet.append(trajetBtn, resu);
// Trajet déjà calculé (après le scrape) : on l'affiche tout de suite (recalcul local instantané).
if ((p["Trajet distance km"] || "").trim()) calculerTrajet(true);
corps.append(secInfos, secContact, secTrajet);
}