---
name: project-zip-backup-referentiel
description: Système de sauvegarde ZIP pour le référentiel plateformes — export/import avec manifest + data + logos
metadata: 
  node_type: memory
  type: project
  originSessionId: 264d200a-fea4-4903-b7c5-20dcc9ebfbd2
---

Système complet d'export/import ZIP pour `plateformes_referentiel`.

**Fichiers créés/modifiés :**
- `backend/src/utils/zip.js` — helper ZIP pur Node.js (pas de dépendance externe). `createZip(entries)` + `readZip(buffer)`. Utilise `zlib.deflateRawSync` / `inflateRawSync` + CRC-32 maison.
- `backend/src/routes/referentiel.js` — 3 nouvelles routes (positionnées AVANT `/:id`) :
  - `GET /api/referentiel/export` → télécharge tout le référentiel en ZIP
  - `GET /api/referentiel/:id/export` → télécharge une seule entrée en ZIP
  - `POST /api/referentiel/import-zip` → importe un ZIP (multipart `file`), écrase en cas de conflit de `nom`
- `frontend/src/api.js` — méthode `api.blob(path)` ajoutée pour les téléchargements binaires authentifiés
- `frontend/src/pages/AdminPlateformes.jsx` — `ReferentielSection` :
  - Boutons "Exporter tout" + "Importer" dans la barre d'outils
  - Entrée "Exporter" dans le menu ⋮ par ligne
  - `importResult` banner via `ResultBanner`

**Structure ZIP (version 1.1) :**
```
manifest.json    { version: '1.1', app, exported_at, count, type }
data.json        [ { nom, url, domiciliation, ..., categories_inv: [noms], secteurs_inv: [noms], logo_filename, icone_filename, notation: [...] } ]
garanties.json   [ { libelle, description, ordre } ]  — types de garanties du user exporteur
logos/           fichiers image logo/icône (si présents sur le serveur)
```

**Import — comportement :**
- Conflit `nom` → UPDATE (écrase tout)
- `categories_inv` / `secteurs_inv` par noms → crée les tags globaux manquants (`user_id = NULL`)
- Images dans le ZIP → écrites dans `logosDir` (= `DATA_DIR/logos`)
- `notation` par plateforme → DELETE + re-INSERT dans `referentiel_notation`
- `garanties.json` → upsert dans `garantie_types` pour le user qui importe

**Why:** Demande explicite — sauvegarde et migration du référentiel entre instances.

**How to apply:** Toute évolution du schéma `plateformes_referentiel` doit répercuter les nouveaux champs dans les routes export (liste `fields`) et dans la logique d'UPDATE/INSERT de l'import.
