Version initiale — carte des établissements scolaires

Carte Leaflet (annuaire Éducation nationale) + API PHP/MySQL :
fiche établissement (effectifs, IPS, population INSEE, DPE ADEME),
GED documents/photos, commentaires par groupe, gestion utilisateurs
et politique de mots de passe. Imports opendata (effectifs, IPS,
population, DPE, IRIS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 21:35:41 +02:00
commit 5633969d98
40 changed files with 7242 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
<?php
/**
* DPE (ADEME) rattachés à un établissement, par proximité géographique.
* GET ?uai=UAI → [ { numero_dpe, etiquette_dpe, etiquette_ges, conso, ges,
* surface, periode, cat_erp, date_dpe, date_fin,
* adresse, distance_m }, ... ] trié par distance croissante
* POST ?action=latest body { uais:[...] } → { uai: { dpe, ges } } meilleur match (le + proche)
*
* Rattachement calculé par match_dpe.php (table etab_dpe). Source : import_dpe.php.
*/
declare(strict_types=1);
require __DIR__ . '/db.php';
try {
// Batch : meilleur DPE (le plus proche) pour une liste d'UAI → { uai: {dpe, ges} }.
if (($_GET['action'] ?? '') === 'latest') {
$uais = body_json()['uais'] ?? [];
if (!is_array($uais) || !$uais) {
json_out([]);
}
$uais = array_slice(array_values(array_unique(array_map('strval', $uais))), 0, 5000);
$ph = implode(',', array_fill(0, count($uais), '?'));
// Pour chaque UAI, le rattachement de plus petite distance. En cas
// d'ex æquo, la boucle PHP ci-dessous ne garde qu'une ligne par UAI
// (pas de GROUP BY ⇒ compatible only_full_group_by, MySQL et MariaDB).
$sql = "SELECT ed.uai, d.etiquette_dpe, d.etiquette_ges
FROM etab_dpe ed
JOIN dpe d ON d.numero_dpe = ed.numero_dpe
JOIN (SELECT uai, MIN(distance_m) AS dmin
FROM etab_dpe WHERE uai IN ($ph) GROUP BY uai) m
ON m.uai = ed.uai AND m.dmin = ed.distance_m";
$st = db()->prepare($sql);
$st->execute($uais);
$out = [];
foreach ($st as $r) {
$out[$r['uai']] = ['dpe' => $r['etiquette_dpe'], 'ges' => $r['etiquette_ges']];
}
json_out($out);
}
$uai = trim((string) ($_GET['uai'] ?? ''));
if ($uai === '') {
json_error('Paramètre uai requis.');
}
$st = db()->prepare(
'SELECT d.numero_dpe, d.etiquette_dpe, d.etiquette_ges, d.conso, d.ges,
d.surface, d.periode, d.cat_erp, d.date_dpe, d.date_fin, d.adresse,
ed.distance_m
FROM etab_dpe ed
JOIN dpe d ON d.numero_dpe = ed.numero_dpe
WHERE ed.uai = ?
ORDER BY ed.distance_m'
);
$st->execute([$uai]);
$out = [];
foreach ($st as $r) {
$out[] = [
'numero_dpe' => $r['numero_dpe'],
'etiquette_dpe' => $r['etiquette_dpe'],
'etiquette_ges' => $r['etiquette_ges'],
'conso' => $r['conso'] !== null ? (float) $r['conso'] : null,
'ges' => $r['ges'] !== null ? (float) $r['ges'] : null,
'surface' => $r['surface'] !== null ? (int) $r['surface'] : null,
'periode' => $r['periode'],
'cat_erp' => $r['cat_erp'],
'date_dpe' => $r['date_dpe'],
'date_fin' => $r['date_fin'],
'adresse' => $r['adresse'],
'distance_m' => (int) $r['distance_m'],
];
}
json_out($out);
} catch (Throwable $e) {
json_error('Erreur : ' . $e->getMessage(), 500);
}