# Prompt p14 — GED Documents (web)
*Contextes requis : ctx-global.md + ctx-web-nextjs.md + ctx-laravel-bff.md*

---

## Profil & Accès
- **Rôle** : GCG (Responsable Courrier & GED)
- **Nombre d'utilisateurs** : 2
- **Accès** : bibliothèque centrale — toutes les 13 catégories, toutes les versions, recherche sémantique
- **Session** : 8h, OTP à la connexion

---

## Fichiers à créer

```
app/(erp)/ged/page.tsx
app/(erp)/ged/[id]/page.tsx
app/(erp)/ged/[id]/versions/page.tsx
app/(erp)/ged/depot/page.tsx
app/(erp)/ged/recherche/page.tsx
app/(erp)/ged/qa/page.tsx
components/ged/BibliothequeGrid.tsx
components/ged/DocumentCard.tsx
components/ged/DepotWizard.tsx
components/ged/VersionnageTimeline.tsx
components/ged/RechercheSemantiqueBar.tsx
components/ged/QaInterface.tsx
components/ged/MetadonneesPanel.tsx
components/ged/AlerteExpiration.tsx
components/ged/CategorieFilter.tsx
hooks/useGed.ts
hooks/useRechercheGed.ts
```

---

## Spec UX condensée

```
┌─────────────────────────────────────────────────────────────────────┐
│ FLOWUP ERP          GED — Bibliothèque Centrale            [GCG]    │
├─────────────────────────────────────────────────────────────────────┤
│ [+ Déposer]   ⚠ Alertes expiration: 3 documents (J-7)             │
├─────────────────────────────────────────────────────────────────────┤
│ RECHERCHE SÉMANTIQUE (IA)                                           │
│ ┌──────────────────────────────────────────────────────────────┐   │
│ │ 🔍  Contrats avec TotalGin expirés en 2025...                │   │
│ └──────────────────────────────────────────────────────────────┘   │
│ [Recherche classique] [Q&A en langage naturel]                      │
├────────────────────────────────────────────────────────────────────┤
│ CATÉGORIES (13)                          DOCUMENTS (247)           │
│ ┌──────────────────────────────────┐  ┌────────────────────────┐  │
│ │ ■ Contrats          (34) →       │  │ ┌──────────┐ ┌────────┐│  │
│ │ ■ Factures          (89) →       │  │ │CTR-2026  │ │FAC-    ││  │
│ │ ■ RH                (47) →       │  │ │TotalGin  │ │2026-   ││  │
│ │ ■ Légal & Fiscal    (12) →       │  │ │2026-2027 │ │0412    ││  │
│ │ ■ Technique         (23) →       │  │ │v3 ■ ACTIF│ │v1 ACTIF││  │
│ │ ■ HSE               (18) →       │  │ └──────────┘ └────────┘│  │
│ │ ■ Maintenance       (11) →       │  │                        │  │
│ │ ■ Transport         (9)  →       │  │ ┌──────────┐ ┌────────┐│  │
│ │ ■ Qualité           (4)  →       │  │ │RH-2026   │ │ ... ⚠  ││  │
│ │   ... (4 autres)                 │  │ │Contrat   │ │Expire  ││  │
│ └──────────────────────────────────┘  │ │Embauche  │ │J-7     ││  │
│                                       │ │v1 ACTIF  │ │        ││  │
│                                       │ └──────────┘ └────────┘│  │
│                                       └────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘
```

### 13 catégories de documents
1. Contrats (clients, fournisseurs, bail)
2. Factures (achats, ventes)
3. RH (contrats embauche, bulletins, CNSS)
4. Légal & Fiscal (statuts, agrément, NIF, RCCM, DGI)
5. Technique (manuels, schémas, homologations)
6. HSE (déclarations incidents, certifications)
7. Maintenance (bons de travail, rapports)
8. Transport (autorisations, licences camions)
9. Qualité (certifications, rapports audit)
10. Correspondances officielles (courriers DG)
11. Protocoles & Procédures internes
12. Financier (audits externes, états financiers)
13. Divers

### Versioning
- Code : RGED-[CATEGORIE]-[NUM]-v[VERSION] (ex: RGED-CTR-001-v3)
- Chaque nouvelle version archive la précédente (statut "ARCHIVÉ")
- La version active = statut "ACTIF" (une seule par document)
- Comparaison diff entre versions non requise (versions stockées comme fichiers séparés)

### Recherche sémantique vectorielle
- Les documents sont indexés avec embeddings côté BFF (pgvector ou service IA)
- Recherche par similarité sémantique (pas seulement mots-clés)
- Q&A : "Quelle est la date d'expiration du contrat TotalGin ?" → réponse structurée avec citation

### Alertes expiration
- J-30 : notification dans le dashboard GCG
- J-7 : badge rouge sur le document + alerte email au responsable
- Catégories concernées : Contrats, Légal & Fiscal, Transport, Qualité

---

## Endpoints BFF

```
GET /api/documents
  Query : ?categorie={id}&search={q}&statut=actif|archive|en_attente&page={n}&per_page=20
  Réponse : {
    data: [{
      id: INT,
      reference: "RGED-CTR-001",
      version: "v3",
      nom: "Contrat approvisionnement TotalGin 2026-2027",
      categorie: "Contrats",
      statut: "ACTIF"|"ARCHIVÉ"|"EN_ATTENTE_VALIDATION",
      date_expiration: "2027-12-31"|null,
      expire_dans_jours: 597|null,
      alerte: null|"J-30"|"J-7",
      created_at: "...",
      taille_ko: 847
    }],
    meta: { total: INT, expires_bientot: INT },
    categories: [{ id: INT, nom: "Contrats", count: 34 }]
  }

GET /api/documents/{id}
  Réponse : {
    id: INT,
    reference: "RGED-CTR-001",
    version_actuelle: "v3",
    nom: "...",
    categorie: "Contrats",
    metadonnees_ia: {
      resume: "Contrat d'approvisionnement carburant...",
      parties: ["FEBI ITC SA", "TotalGin SA"],
      date_debut: "2026-01-01",
      date_fin: "2027-12-31",
      montant_annuel: "2400000000",   // VARCHAR
      tags: ["carburant", "fournisseur", "2026"]
    },
    fichier_url: "https://...",
    statut: "ACTIF",
    versions: [{ version: "v1", date: "...", auteur: "..." }]
  }

GET /api/documents/{id}/versions
  Réponse : [{
    version: "v3",
    statut: "ACTIF",
    date: "2026-03-15",
    auteur: "GCG Bah",
    taille_ko: 847,
    fichier_url: "..."
  }]

POST /api/documents
  Body : FormData {
    fichier: File,
    categorie_id: INT,
    nom: "...",
    date_expiration: "2027-12-31"|null
  }
  Réponse : { id: INT, reference: "RGED-CTR-001-v1", statut: "EN_ATTENTE_VALIDATION",
              analyse_ia: { en_cours: true } }

POST /api/documents/{id}/nouvelle-version
  Body : FormData { fichier: File, motif_revision: "Avenant n°2" }
  Réponse : { id: INT, reference: "RGED-CTR-001-v3", statut: "EN_ATTENTE_VALIDATION" }

GET /api/documents?search={q}
  Query : ?mode=semantique|classique
  Réponse : { data: [...], mode_utilise: "semantique", pertinence: [0.98, 0.87, ...] }

POST /api/documents/qa
  Body : { question: "Quelle est la date d'expiration du contrat TotalGin ?" }
  Réponse : {
    reponse: "Le contrat TotalGin (RGED-CTR-001-v3) expire le 31 décembre 2027.",
    sources: [{ document_id: INT, reference: "RGED-CTR-001", extrait: "..." }],
    confiance: "0.94"  // VARCHAR
  }

GET /api/documents/alertes-expiration
  Query : ?horizon=7|30
  Réponse : [{ id: INT, reference: "...", nom: "...", date_expiration: "...", jours: INT }]
```

---

## Règles spécifiques

- **RGGED-01** : Les codes de référence sont immuables après création (RGED-[CAT]-[NUM]). Le numéro de version (v1, v2...) est la seule partie incrémentale.
- **RGGED-02** : Toute nouvelle version d'un document actif passe par statut "EN_ATTENTE_VALIDATION" (analyse IA async). L'ancienne version reste "ACTIF" pendant ce temps.
- **RGGED-03** : Analyse IA (extraction métadonnées) est asynchrone — l'UI poll toutes les 3s (`GET /api/documents/{id}`) jusqu'à `analyse_ia.en_cours === false`.
- **RGGED-04** : La recherche sémantique se déclenche après 500ms d'inactivité sur le champ (debounce 500ms). Mode "classique" si le serveur IA est indisponible (fallback).
- **RGGED-05** : Q&A : chaque réponse IA doit afficher ses sources (documents cités) avec lien direct. L'interface indique clairement que c'est une réponse IA (pas un document officiel).
- **RGGED-06** : Alertes J-7 = badge rouge dans la grille ET bandeau en haut de page. Alertes J-30 = badge orange dans la grille seulement.
- **RGGED-07** : IDs = `number` (INT UNSIGNED). Soft delete = `statut: 3` (document supprimé — invisible dans la bibliothèque mais conservé pour audit).
- **RGGED-08** : Le téléchargement d'un document s'effectue via une URL signée (expirée après 15min) — jamais via une URL publique permanente.

---

## Tâche Claude

Génère le code complet Next.js 15 TypeScript pour le module GED Documents FlowUp ERP.

**Contraintes techniques absolues :**
- Palette navy `#1A2157`, blue `#1E5EFF`, cyan `#00C8C0` — Inter + JetBrains Mono
- IDs = `number` (INT UNSIGNED). Soft delete = `statut: 3`
- Montants dans les métadonnées IA = VARCHAR(255) → `string`
- Upload multipart avec prévisualisation fichier
- Polling async pour l'analyse IA (3s interval, cleanup sur unmount)

**Génère dans cet ordre :**
1. Types TypeScript (`types/ged.ts`)
2. Hook `useGed.ts` (bibliothèque, détail, versions, alertes)
3. Hook `useRechercheGed.ts` (sémantique + classique, debounce 500ms, Q&A)
4. `CategorieFilter.tsx` (13 catégories, compteurs)
5. `AlerteExpiration.tsx` (bandeau J-7, badges J-7/J-30)
6. `DocumentCard.tsx` (grille card avec badges)
7. `MetadonneesPanel.tsx` (sidebar métadonnées IA)
8. `VersionnageTimeline.tsx` (historique versions)
9. `RechercheSemantiqueBar.tsx` (input + switch mode)
10. `QaInterface.tsx` (question → réponse IA avec sources)
11. `DepotWizard.tsx` (upload + polling analyse IA)
12. `BibliothequeGrid.tsx` (grille principale)
13. Pages : `page.tsx`, `[id]/page.tsx`, `[id]/versions/page.tsx`, `depot/page.tsx`, `recherche/page.tsx`, `qa/page.tsx`
