---
name: project_mass_export_delete
description: Export CSV + suppression en masse depuis la sélection de réservations (subnet.php)
metadata:
  type: project
---

Livré 2026-07-16 (commit `c035dc1`). La barre de sélection de `subnet.php` (le `Set` de
`host_id` déjà utilisé par le mass update [[project_mass_update]]) pilote 2 actions de plus
(admin|tech) :

- **Exporter** → `subnet_export.php?subnet_id=X&host_ids=1,4,7`. Paramètre `host_ids` optionnel
  ajouté à l'export existant : filtre le CSV à la sélection ; vide = export complet inchangé.
  Fichier suffixé `-selection`. Zéro duplication du code CSV.
- **Supprimer** → POST vers `reservation_mass_delete.php`, **page de confirmation serveur**
  calquée sur `reservation_delete.php` (PAS de modale ni d'AJAX — décision : « reprendre la même
  logique que la suppression unitaire »). Détection serveur des leases actifs via
  `findActiveLeases` → 1 bouton si aucun lease, sinon 2 (« sans libérer » 1er = Entrée sûre,
  « et libérer » btn-danger). Audit `reservation.mass_delete`.

**Sécurité clé** : l'endpoint valide l'**appartenance de chaque host_id au subnet**
(`Reservation::getById($hid)['dhcp4_subnet_id'] === $subnet['kea_subnet_id']`) → un host_id d'un
autre subnet est rejeté (anti-injection). Vérifié contre la vraie base kea (rejet cross-subnet,
dédup, sélection exacte).

Lié à [[project_lease_release]] (même politique leases : ignore avant release, échec = warning
pas de rollback, h() partout).
