path = "backend/src/db/index.js" with open(path, "r", encoding="utf-8") as f: content = f.read() anchor = """ })(); } export default db; """ assert content.count(anchor) == 1, f"anchor count={content.count(anchor)}" block = ''' })(); } // Extension du 29/09/26 (demande Olivier, à propos de produits Spiko/Regular Finance) : "sais-tu // comment les classifier ?" — Spiko et Regular Finance ne sont pas des enveloppes mais des // PLATEFORMES/INSTITUTIONS donnant accès à un fonds monétaire (OPCVM monétaire, y compris // lorsqu'il est tokenisé sur blockchain comme chez Spiko) : elles ont vocation à rejoindre // institutions_referentiel (catégorie à créer, ex. "Gestion de trésorerie"), pas // enveloppes_referentiel — le rattachement viendra en Phase 3. Ce qui manquait réellement à CE // référentiel, c'est le SUPPORT lui-même : "OPCVM / fonds actifs" existant désigne des fonds // actions/obligations/diversifiés gérés activement, pas un fonds monétaire (quasi-cash, duration // très courte, profil de risque très différent) — les deux ne doivent pas être confondus. // Toujours exécuté (INSERT OR IGNORE, clés UNIQUE sur nom), même principe que les extensions // précédentes. { db.prepare("INSERT OR IGNORE INTO supports_referentiel (nom, description) VALUES (?, ?)").run( 'Fonds monétaires (OPCVM monétaire)', "Fonds monétaire classique ou tokenisé sur blockchain (ex. Spiko, Regular Finance) — quasi-cash, duration très courte, distinct d'un OPCVM actions/obligations/diversifié." ); const getSuppRefIdMonetaire = db.prepare('SELECT id FROM supports_referentiel WHERE nom = ?'); const suppMonetaire = getSuppRefIdMonetaire.get('Fonds monétaires (OPCVM monétaire)'); if (suppMonetaire) { const getEnvRefIdMonetaire = db.prepare('SELECT id FROM enveloppes_referentiel WHERE nom = ?'); const linkEnvSuppMonetaire = db.prepare('INSERT OR IGNORE INTO enveloppes_supports_disponibles (enveloppe_id, support_id) VALUES (?, ?)'); // Enveloppes où un fonds monétaire a sa place (menu de supports déjà large, cohérent avec un // placement défensif) — PEA/PEA-PME exclus (non éligibles réglementairement), enveloppes // "cash" (Livret A, comptes courants...) exclues (déjà sans menu de supports par nature). for (const envNom of [ 'Compte-titres ordinaire (CTO)', 'Assurance-vie multisupport', 'PER individuel', 'PER collectif / obligatoire (PERCOL, article 83)', 'Contrat de capitalisation', 'Assurance-vie luxembourgeoise', ]) { const env = getEnvRefIdMonetaire.get(envNom); if (env) linkEnvSuppMonetaire.run(env.id, suppMonetaire.id); } } } export default db; ''' content = content.replace(anchor, block, 1) with open(path, "w", encoding="utf-8") as f: f.write(content) print("Fonds monétaires support + links inserted OK, new length:", len(content))