**Résumé**
- **Routes analysées**: 29 (fichiers `route.ts` sous `src/app/api`).
- **Principaux types d'identifiants**: `id` (PK techniques), `COS` (identifiant salarié métier), `id_contrat` / `id_salarie` (contrats), `id_salarie` (références salariés dans plusieurs tables), `externalId` (lookup business contract id), `auth_token` (cookie JWT).

**Règle d'harmonisation adoptée**
- Les réponses publiques masquent désormais les `id` techniques quand un identifiant métier existe.
- Les utilisateurs voient en priorité `COS` pour les employés et `id_contrat` pour les contrats.
- Les routes et services conservent les `id` techniques en interne pour les opérations CRUD, mais ces clés ne sont plus exposées par défaut dans les payloads API.
- Les réponses publiques normalisent aussi certains noms de champs métier: `id_salarie` est la forme publique pour les références salariés, y compris les sources internes.

**Observations générales**
- La plupart des collections utilisent `id` (entier auto-incrément) comme PK technique (ex: `contrats`, `diplomes`, `absences`, `visites_medicales`, `avenants`).
- Les salariés sont souvent identifiés par une colonne métier `COS` (utilisée en tant que clé unique dans `employes` et dans les services pour les recherches/updates/deletes).
- Les contrats utilisent désormais `id_contrat` et `id_salarie` comme clés publiques; `id` reste l'identifiant technique interne.
- Depuis l'harmonisation, les réponses API publiques ne renvoient plus `id` lorsque la donnée métier permet d'identifier l'enregistrement.
- Les noms de champs visibles côté API sont désormais homogènes autour de `id_contrat`, `id_salarie`, `COS` et `id` technique selon le cas.

**Routes (par fichier)**
- **/api/visites-medicales/[id]**: [backend/backend_envie2e/src/app/api/visites-medicales/[id]/route.ts](backend/backend_envie2e/src/app/api/visites-medicales/%5Bid%5D/route.ts)
  - Méthodes: GET, PUT, DELETE
  - Param dynamique: `id` (entier)
  - Identifiants utilisés: `id` (visite PK), payloads utilisent `id_salarie` (FK vers salarié)

- **/api/diplomes/[id]**: [backend/backend_envie2e/src/app/api/diplomes/[id]/route.ts](backend/backend_envie2e/src/app/api/diplomes/%5Bid%5D/route.ts)
  - Méthodes: GET, PUT, DELETE
  - Param dynamique: `id` (entier)
  - Identifiants: `id` (diplôme PK), payloads: `id_salarie`

- **/api/visites-medicales**: [backend/backend_envie2e/src/app/api/visites-medicales/route.ts](backend/backend_envie2e/src/app/api/visites-medicales/route.ts)
  - Méthodes: GET (pagination `limit/offset`), POST
  - Identifiants: POST body attend `id_salarie` (référence employé)

- **/api/diplomes**: [backend/backend_envie2e/src/app/api/diplomes/route.ts](backend/backend_envie2e/src/app/api/diplomes/route.ts)
  - Méthodes: GET, POST
  - Identifiants: POST body attend `id_salarie`

- **/api/avenants**: [backend/backend_envie2e/src/app/api/avenants/route.ts](backend/backend_envie2e/src/app/api/avenants/route.ts)
  - Méthodes: GET, POST
  - Identifiants: POST body contient `id_contrat`; services résolvent `id_contrat` contre `id` technique ou la clé métier interne du contrat

- **/api/types-diplome**: [backend/backend_envie2e/src/app/api/types-diplome/route.ts](backend/backend_envie2e/src/app/api/types-diplome/route.ts)
  - Méthodes: GET (pagination)
  - Identifiants: pas d'ID métier (pagination uniquement)

- **/api/absences/[id]**: [backend/backend_envie2e/src/app/api/absences/[id]/route.ts](backend/backend_envie2e/src/app/api/absences/%5Bid%5D/route.ts)
  - Méthodes: GET, PUT, DELETE
  - Param: `id` (entier)
  - Identifiants: `id` (absence PK), payloads: `id_salarie`

- **/api/absences**: [backend/backend_envie2e/src/app/api/absences/route.ts](backend/backend_envie2e/src/app/api/absences/route.ts)
  - Méthodes: GET, POST
  - Identifiants: POST body attend `id_salarie`

- **/api/contrats**: [backend/backend_envie2e/src/app/api/contrats/route.ts](backend/backend_envie2e/src/app/api/contrats/route.ts)
  - Méthodes: GET, POST
  - Identifiants: POST body requires `id_salarie`, contrats exposent `id_contrat` et `id_salarie`

- **/api/types-cs**: [backend/backend_envie2e/src/app/api/types-cs/route.ts](backend/backend_envie2e/src/app/api/types-cs/route.ts)
  - Méthodes: GET
  - Identifiants: pagination only

- **/api/types-absence**: [backend/backend_envie2e/src/app/api/types-absence/route.ts](backend/backend_envie2e/src/app/api/types-absence/route.ts)
  - Méthodes: GET

- **/api/contrats/[id]**: [backend/backend_envie2e/src/app/api/contrats/[id]/route.ts](backend/backend_envie2e/src/app/api/contrats/%5Bid%5D/route.ts)
  - Méthodes: GET, PUT, DELETE
  - Param: `id` (entier technique)
  - Identifiants: `id` (PK technique); les réponses publiques exposent `id_contrat`

- **/api/postes**: [backend/backend_envie2e/src/app/api/postes/route.ts](backend/backend_envie2e/src/app/api/postes/route.ts)
  - Méthodes: GET

- **/api/etablissements**: [backend/backend_envie2e/src/app/api/etablissements/route.ts](backend/backend_envie2e/src/app/api/etablissements/route.ts)
  - Méthodes: GET

- **/api/secteurs**: [backend/backend_envie2e/src/app/api/secteurs/route.ts](backend/backend_envie2e/src/app/api/secteurs/route.ts)
  - Méthodes: GET

- **/api/employes**: [backend/backend_envie2e/src/app/api/employes/route.ts](backend/backend_envie2e/src/app/api/employes/route.ts)
  - Méthodes: GET, POST
  - Identifiants: POST body requires `COS` (identifiant métier employé)

- **/api/classifications**: [backend/backend_envie2e/src/app/api/classifications/route.ts](backend/backend_envie2e/src/app/api/classifications/route.ts)
  - Méthodes: GET

- **/api/contrats/by-external/[externalId]**: [backend/backend_envie2e/src/app/api/contrats/by-external/%5BexternalId%5D/route.ts](backend/backend_envie2e/src/app/api/contrats/by-external/%5BexternalId%5D/route.ts)
  - Méthodes: GET
  - Param dynamique: `externalId` (entier), résout le contrat par `id_contrat` public / identifiant business

- **/api/types-avenants**: [backend/backend_envie2e/src/app/api/types-avenants/route.ts](backend/backend_envie2e/src/app/api/types-avenants/route.ts)
  - Méthodes: GET

- **/api/auth/me**: [backend/backend_envie2e/src/app/api/auth/me/route.ts](backend/backend_envie2e/src/app/api/auth/me/route.ts)
  - Méthodes: GET
  - Identifiants: utilise `auth_token` (cookie or Authorization header) — token contains `sub` (username) and `role`

- **/api/types-contrat**: [backend/backend_envie2e/src/app/api/types-contrat/route.ts](backend/backend_envie2e/src/app/api/types-contrat/route.ts)
  - Méthodes: GET

- **/api/auth/logout**: [backend/backend_envie2e/src/app/api/auth/logout/route.ts](backend/backend_envie2e/src/app/api/auth/logout/route.ts)
  - Méthodes: POST
  - Identifiants: supprime cookie `auth_token`

- **/api/auth/login**: [backend/backend_envie2e/src/app/api/auth/login/route.ts](backend/backend_envie2e/src/app/api/auth/login/route.ts)
  - Méthodes: POST
  - Identifiants: body `username`/`password`; réponse met le cookie `auth_token`

- **/api/employes/[cos]**: [backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/route.ts](backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/route.ts)
  - Méthodes: GET, PUT, DELETE
  - Param: `cos` (entier métier)
  - Identifiants: `COS` utilisé pour recherche/maj/suppression; suppression gère conflits FK → retourne `409` si dépendances existantes

- **/api/contrats/[id]/avenants**: [backend/backend_envie2e/src/app/api/contrats/%5Bid%5D/avenants/route.ts](backend/backend_envie2e/src/app/api/contrats/%5Bid%5D/avenants/route.ts)
  - Méthodes: GET
  - Param: `id` (contrat technique) — réponse publique normalisée avec `id_contrat`

- **/api/health**: [backend/backend_envie2e/src/app/api/health/route.ts](backend/backend_envie2e/src/app/api/health/route.ts)
  - Méthodes: GET
  - Identifiants: aucun (simple check DB)

- **/api/employes/by-cos/[cos]**: [backend/backend_envie2e/src/app/api/employes/by-cos/%5Bcos%5D/route.ts](backend/backend_envie2e/src/app/api/employes/by-cos/%5Bcos%5D/route.ts)
  - Méthodes: GET
  - Param: `cos` (même que `/api/employes/[cos]`, lookup par COS)

- **/api/employes/[cos]/disciplinaires**: [backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/disciplinaires/route.ts](backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/disciplinaires/route.ts)
  - Méthodes: GET
  - Param: `cos` (utilisé comme `num_salarie` dans le service sanctions)

- **/api/employes/[cos]/sanctions**: [backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/sanctions/route.ts](backend/backend_envie2e/src/app/api/employes/%5Bcos%5D/sanctions/route.ts)
  - Méthodes: GET
  - Param: `cos` (utilisé comme `num_salarie`)

**Incohérences / points d'attention**
- **Nommage**: la surface publique est désormais homogène autour de `id_contrat` et `id_salarie`. Il reste des noms internes DB à gérer dans les services, mais ils ne devraient plus fuiter côté API.
- **Clé employé**: le projet utilise `COS` comme identifiant métier pour les salariés, et `id_salarie` est la forme publique de référence utilisée dans les payloads API.
- **Contrats**: la forme publique expose `id_contrat` et `id_salarie`; `id` reste interne pour les opérations techniques.
- **Erreurs HTTP**: suppression d'un employé retourne `409` quand des enregistrements dépendants existent (bonne pratique).

**Recommandations rapides**
- Documenter formellement la correspondance des identifiants: `id` (PK technique), `COS` (identifiant métier employé), `id_contrat` et `id_salarie` (contrats). Ajouter tableau de mapping dans `docs/EMPLOYE_ID_GUIDE.md` ou créer `docs/IDS_MAP.md`.
- Harmoniser les noms dans les validators et les tests pour correspondre aux clés publiques utilisées par l'API.
- Ajouter tests unitaires ciblés pour les endpoints qui exposent des identifiants métier publics afin d'éviter les régressions.
- Si souhaité, centraliser la logique de parsing/validation d'identifiants (ex: fonctions utilitaires `parseIntId`, `parseCos`) pour réutilisation.

---
Rapport généré automatiquement. Si tu veux, je peux:
- Écrire ce rapport dans `docs/ROUTES_ID_REPORT.md` (je viens de le créer),
- Générer un tableau CSV ou JSON référençant chaque route et les IDs utilisés,
- Lancer un grep plus fin pour extraire toutes les clés `where: { ... }` dans `src/services` pour cartographier précisément les colonnes Prisma utilisées.

Dis-moi quelle suite tu veux que j'automatise ensuite.