5633969d98
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>
76 lines
3.2 KiB
PHP
76 lines
3.2 KiB
PHP
<?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);
|
|
}
|