# Prompt p13 — GEC Courriers (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** : tous les courriers entrants/sortants, toutes les relances, pipeline IA
- **Session** : 8h, OTP à la connexion

---

## Fichiers à créer

```
app/(erp)/courriers/page.tsx
app/(erp)/courriers/[id]/page.tsx
app/(erp)/courriers/nouveau/page.tsx
app/(erp)/courriers/relances/page.tsx
components/courriers/CourrierList.tsx
components/courriers/CourrierForm.tsx
components/courriers/PipelineIa.tsx
components/courriers/ValidationIaModal.tsx
components/courriers/RelanceCalendrier.tsx
components/courriers/OcrUpload.tsx
components/courriers/WhatsappIngestion.tsx
components/courriers/QrAuthenticiteBadge.tsx
components/courriers/WorkflowCourrier.tsx
hooks/useCourriers.ts
hooks/useRelances.ts
```

---

## Spec UX condensée

```
┌─────────────────────────────────────────────────────────────────────┐
│ FLOWUP ERP          GEC — Gestion des Courriers            [GCG]    │
├─────────────────────────────────────────────────────────────────────┤
│ [+ Nouveau]  [IMAP: 3✉][WhatsApp: 1][OCR: 2]  Relances: ⚠7 en ret.│
├──────────────────────────────────────┬──────────────────────────────┤
│ PIPELINE IA (validation requise)     │ LISTE COURRIERS              │
│                                      │                              │
│ ┌──────────────────────────────────┐ │ Filtres: [Tous▾][Canal▾]    │
│ │ 📧 REC-2026-0047 · IMAP          │ │ Recherche: [________]       │
│ │ De: dgi-guinee@finances.gov.gn   │ │ ─────────────────────────  │
│ │ Sujet: Avis de redressement...   │ │ ● REC-2026-0048  urgent     │
│ │                                  │ │   WhatsApp · Fournisseur   │
│ │ 🤖 Classification IA             │ │   Réponse requise: J+1     │
│ │    Type: Fiscal/Légal            │ │ ─────────────────────────  │
│ │    Priorité: URGENT              │ │ ● REC-2026-0047  fiscal    │
│ │    Action: Transmettre au CFO    │ │   IMAP · DGI              │
│ │                                  │ │   Pipeline IA en attente   │
│ │ ⚠ Validation humaine requise     │ │ ─────────────────────────  │
│ │                                  │ │ ✓ REC-2026-0041  traité    │
│ │ [✓ VALIDER] [✗ CORRIGER]        │ │   Upload manuel · Contrat  │
│ └──────────────────────────────────┘ │                              │
│                                      │                              │
│ 2 courriers en attente validation    │                              │
├──────────────────────────────────────┴──────────────────────────────┤
│ RELANCES AUTOMATIQUES                                               │
│ J+1: 12 · J+3: 7 · J+5: 3 · J+7: 1 (dossiers critiques)          │
└─────────────────────────────────────────────────────────────────────┘
```

### 4 canaux d'ingestion
1. **IMAP Auto** : polling toutes les 5min sur la boîte officielle FEBI ITC. Extraction automatique des pièces jointes. Classé automatiquement par l'IA.
2. **WhatsApp Business API** : messages reçus via webhook Meta. OCR sur les images. IA pour classification.
3. **OCR Upload** : interface glisser-déposer pour documents papier scannés. OCR (Tesseract/Vision API), extraction texte + métadonnées.
4. **Upload Manuel** : PDF/images directement, sans OCR. Classification manuelle obligatoire.

### Pipeline IA (validation humaine OBLIGATOIRE)
1. **Ingestion** : document reçu (tous canaux)
2. **OCR** (si image/scan) : extraction texte
3. **Classification IA** : type document, priorité, expéditeur
4. **Résumé IA** : résumé en 2-3 phrases
5. **Action suggérée** : transmettre à qui, délai réponse
6. **Validation humaine** : GCG valide ou corrige AVANT tout traitement
7. **Traitement** : transmission, archivage, relance programmée

### Workflow Simple/Important/Officiel DG
- **Simple** : GCG traite et archive directement
- **Important** : transmission au manager concerné + accusé de réception
- **Officiel DG** : courrier officiel → validation DG requise avant réponse + QR authenticité sur la réponse

---

## Endpoints BFF

```
GET /api/courriers
  Query : ?canal=imap|whatsapp|ocr|manuel&statut=nouveau|en_cours|traite|archive
           &priorite=urgent|normal&page={n}
  Réponse : {
    data: [{
      id: INT,
      reference: "REC-2026-0047",
      canal: "imap",
      expediteur: "DGI Guinée",
      sujet: "Avis de redressement fiscal",
      statut: "nouveau"|"validation_ia"|"en_cours"|"traite",
      priorite: "urgent"|"normal",
      niveau: "simple"|"important"|"officiel_dg",
      relance_prochaine: "2026-05-14"|null,
      created_at: "..."
    }],
    pipeline_ia: [{ id: INT, ... }],   // courriers en attente validation IA
    relances: { j1: 12, j3: 7, j5: 3, j7: 1 }
  }

GET /api/courriers/{id}
  Réponse : {
    id: INT,
    reference: "REC-2026-0047",
    canal: "imap",
    expediteur_email: "dgi-guinee@finances.gov.gn",
    sujet: "Avis de redressement fiscal",
    corps_texte: "...",
    pieces_jointes: ["url1"],
    ia: {
      classification: "Fiscal/Légal",
      priorite: "URGENT",
      resume: "La DGI notifie FEBI ITC d'un redressement...",
      action_suggeree: "Transmettre au CFO — délai réponse 48h",
      validated_by: null,
      validated_at: null
    },
    workflow: [{ etape: "...", date: "...", acteur: "..." }],
    relances: [{ type: "J+1", date: "...", envoye: true }]
  }

POST /api/courriers
  Body : FormData { fichier: File, canal: "manuel", sujet: "...", expediteur: "..." }
  Réponse : { id: INT, reference: "..." }

POST /api/courriers/{id}/valider-ia
  Body : {
    validated: true,
    corrections: {  // si GCG corrige la suggestion IA
      classification: "...|null",
      priorite: "...|null",
      action: "...|null"
    }
  }
  Réponse : { id: INT, statut: "en_cours" }

PUT /api/courriers/{id}/statut
  Body : { statut: "en_cours"|"traite"|"archive", commentaire: "..." }
  Réponse : { id: INT, statut: "..." }

POST /api/courriers/sortants
  Body : {
    en_reponse_a: INT|null,
    destinataire: "...",
    sujet: "...",
    corps: "...",
    niveau: "simple"|"important"|"officiel_dg",
    avec_qr_authenticite: true
  }
  Réponse : { id: INT, reference: "ENV-2026-0089", qr_url: "...", pdf_url: "..." }

GET /api/relances
  Query : ?type=j1|j3|j5|j7
  Réponse : [{ courrier_id: INT, reference: "...", expediteur: "...", date_relance: "..." }]
```

---

## Règles spécifiques

- **RGCOU-01** : La validation humaine (étape 6 pipeline IA) est OBLIGATOIRE — aucun courrier ne peut passer en statut "en_cours" sans `validated_by` renseigné. Le BFF rejette toute transition sans validation IA.
- **RGCOU-02** : Les courriers "Officiel DG" sortants incluent automatiquement un QR d'authenticité généré par le BFF. L'URL du QR pointe vers `verif.flowup-febi.com/{ref}`.
- **RGCOU-03** : Relances automatiques J+1/J+3/J+5/J+7 envoyées par le BFF (cron). L'interface affiche uniquement l'état des relances, elle ne les déclenche pas.
- **RGCOU-04** : L'OCR est traité côté BFF (pas de lib OCR côté client). L'upload déclenche un job async — l'UI affiche "OCR en cours..." avec polling toutes les 3s jusqu'à completion.
- **RGCOU-05** : Données sensibles : le corps du courrier n'est visible qu'au GCG et aux destinataires autorisés. Les autres rôles voient uniquement le sujet et la classification.
- **RGCOU-06** : IDs = `number` (INT UNSIGNED). Soft delete = `statut: 3` (courrier archivé définitivement — accessible en recherche mais pas dans la liste principale).
- **RGCOU-07** : Recherche full-text sur sujet + expéditeur + résumé IA, debounce 300ms, SWR.
- **RGCOU-08** : Le pipeline IA (gauche) est un panneau live — polling toutes les 10s pour les nouveaux courriers en attente de validation.

---

## Tâche Claude

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

**Contraintes techniques absolues :**
- Palette navy `#1A2157`, blue `#1E5EFF`, cyan `#00C8C0` — Inter + JetBrains Mono
- IDs = `number` (INT UNSIGNED). Soft delete = `statut: 3`
- Pas de montants dans ce module
- Validation IA = gate obligatoire avant tout traitement
- Upload multipart pour les fichiers

**Génère dans cet ordre :**
1. Types TypeScript (`types/courriers.ts`)
2. Hook `useCourriers.ts` (liste, détail, SWR + polling pipeline IA 10s)
3. Hook `useRelances.ts` (liste relances par type)
4. `OcrUpload.tsx` (drag & drop + polling OCR 3s)
5. `PipelineIa.tsx` (panneau gauche, polling 10s)
6. `ValidationIaModal.tsx` (validation/correction suggestions IA)
7. `WorkflowCourrier.tsx` (timeline étapes)
8. `QrAuthenticiteBadge.tsx` (badge avec lien verif.flowup-febi.com)
9. `RelanceCalendrier.tsx` (J+1/J+3/J+5/J+7)
10. `CourrierForm.tsx` (saisie courrier sortant)
11. `CourrierList.tsx` (liste avec filtres)
12. Pages : `page.tsx`, `[id]/page.tsx`, `nouveau/page.tsx`, `relances/page.tsx`
