path = "backend/src/db/index.js" with open(path, "r", encoding="utf-8") as f: content = f.read() # 1) Retrait de "Gestion pilotée / mandat" du seed initial des supports (SEED_SUPPORTS) — ne # concerne que les installations neuves, ce bloc étant gardé par COUNT()===0. old_seed_line = " { nom: 'Gestion pilotée / mandat', description: 'Allocation déléguée à un gérant selon un profil de risque — mode par défaut de nombreux PER.' },\n" assert content.count(old_seed_line) == 1, f"old_seed_line count={content.count(old_seed_line)}" content = content.replace(old_seed_line, "", 1) # 2) Retrait de 'Gestion pilotée / mandat' des deux listes de supports "classiques" AV/PER # (AV_PER_SUPPORTS et AV_PER_SUPPORTS_EXTRA) — présent dans les deux car dupliqué (la seconde # liste, hors de portée du bloc de seed initial, a été recopiée lors de l'extension du 29/09/26 # pour Contrat de capitalisation / Assurance-vie luxembourgeoise). old_list_fragment = "'Produits structurés', 'Matières premières / métaux précieux', 'Gestion pilotée / mandat'," assert content.count(old_list_fragment) == 2, f"old_list_fragment count={content.count(old_list_fragment)}" new_list_fragment = "'Produits structurés', 'Matières premières / métaux précieux'," content = content.replace(old_list_fragment, new_list_fragment) # replace_all (2 occurrences) # 3) Nouveau bloc toujours exécuté : supprime la ligne "Gestion pilotée / mandat" pour les # installations déjà seedées (le retrait du texte source ci-dessus ne corrige que les # installations neuves). ON DELETE CASCADE sur enveloppes_supports_disponibles nettoie # automatiquement les liens existants vers ce support — c'est un pur catalogue (aucune donnée # d'investissement réelle n'y est aujourd'hui rattachée), donc la suppression est sans risque. # Toujours exécuté et idempotent (DELETE sans WHERE de garde spécifique au-delà du nom — un # deuxième passage ne trouve simplement plus rien à supprimer). anchor = "\nexport default db;\n" assert content.count(anchor) == 1, f"anchor count={content.count(anchor)}" block = ''' // Correctif du 29/09/26 (suite) — retrait du support "Gestion pilotée / mandat" (demande // Olivier, à propos d'une capture d'écran distinguant "3 modes de gestion" — libre / pilotée / // mixte — d'un contrat d'assurance-vie) : le "mode de gestion" décrit QUI décide de l'allocation // (le titulaire, ou un gérant délégué selon un mandat), c'est une dimension orthogonale au // SUPPORT (le type d'instrument financier détenu — ETF, actions, SCPI...). Une gestion pilotée // s'applique justement à un panier de vrais supports (fonds euros, fonds datés, SCPI, produits // structurés...), elle n'en est pas un elle-même. Cette ligne datait du seed initial du 28/09/26 // et n'aurait pas dû être modélisée comme support ; elle est retirée du référentiel et de la // liste de supports "classiques" AV/PER (voir plus haut). Toujours exécuté et idempotent — // DELETE cascade automatiquement les liens vers cette entrée (enveloppes_supports_disponibles, // ON DELETE CASCADE) ; aucune donnée d'investissement réelle n'est rattachée à ce catalogue à ce // stade, la suppression est donc sans risque de perte de données utilisateur. db.prepare("DELETE FROM supports_referentiel WHERE nom = 'Gestion pilotée / mandat'").run(); export default db; ''' content = content.replace(anchor, block, 1) with open(path, "w", encoding="utf-8") as f: f.write(content) print("Gestion pilotée / mandat removed from supports OK, new length:", len(content))