---
name: project-categories-secteurs-inv-heritage
description: "Héritage merge (fusion) des catégories/secteurs d'investissement depuis le référentiel vers les plateformes utilisateur"
metadata:
  node_type: memory
  type: project
  originSessionId: cad3a9c0-cf8e-4204-ac6e-e22c03811abe
---

# Héritage catégories/secteurs d'investissement (merge)

Les catégories et secteurs d'investissement définis dans le référentiel sont **fusionnés** (merge) dans les plateformes liées. Ce mécanisme est distinct de l'héritage scalaire (`overridden_fields`).

**Why:** L'user doit toujours voir les tags du référentiel comme base, sans pouvoir les retirer, mais peut ajouter les siens en plus.

**How to apply:** Toute évolution des tables jonction plateforme↔cats/sects doit préserver cette logique merge. Ne jamais écraser les inherited IDs lors d'un PUT.

---

## Mécanisme

### Backend — `attachCategoriesInv` / `attachSecteursInv` (plateformes.js)

Au moment de lire les plateformes, les tags sont mergés :
1. Charger les propres tags de la plateforme (`plateforme_categories_inv`)
2. Si la plateforme a un `referentiel_id` : charger les tags du référentiel (`referentiel_categories_inv`)
3. Pour chaque tag du référentiel : s'il est déjà dans les propres tags → marquer `is_inherited: true` ; sinon l'ajouter avec `is_inherited: true`
4. Tags propres non dans le référentiel → `is_inherited: false`

### Backend — `PUT /plateformes/:id/categories-inv` (associations-inv.js)

Avant de sauvegarder, les IDs hérités du référentiel sont re-ajoutés à `allIds` (on ne peut pas les retirer).

### Frontend — `InvSelect.jsx`

Prop `inheritedIds={[...]}` :
- Items hérités : toujours cochés + disabled + badge "Réf" (fond accent, 10px)
- `toggle()` ignore les IDs hérités
- CSS : `.cat-select-item.inherited` (cursor: default)

### Frontend — `Settings.jsx`

`openEditPlat()` stocke dans l'état :
```js
inherited_cat_ids:  platCatsInv.filter(c => c.is_inherited).map(c => c.id),
inherited_sect_ids: platSectsInv.filter(s => s.is_inherited).map(s => s.id),
```

InvSelect reçoit `inheritedIds={editPlat.inherited_cat_ids || []}`.

Bandeau héritage : affiche "+ catégories & secteurs" si `hasCatInherit || hasSectInherit`.

### Frontend — `PlatformeProfile.jsx`

Chips en lecture : badge "Réf" sur les items `is_inherited: true`.

---

## Note importante

L'héritage catégories/secteurs est **distinct** des champs scalaires (`HERITABLE_FIELDS` + `overridden_fields`). Le compteur `inheritedCount` dans le bandeau Settings ne compte que les scalaires ; cats/sects sont signalés séparément via `hasCatInherit`/`hasSectInherit`.
