path = "backend/src/db/index.js" with open(path, "r", encoding="utf-8") as f: content = f.read() anchor = "\nexport default db;\n" assert content.count(anchor) == 1, f"anchor count={content.count(anchor)}" block = ''' // Extension du 29/09/26 (suite) — support "ETC" (demande Olivier, à partir d'une capture d'écran // d'un contrat d'assurance-vie distinguant "+200 ETF & 22 ETC" parmi ses supports) : un Exchange // Traded Commodity (ETC) est un instrument coté qui réplique le cours d'une matière première // (or, pétrole...), proche d'un ETF dans sa mécanique de cotation mais sans statut UCITS/OPCVM — // distinct du support "ETF / trackers" (fonds indiciels UCITS) et de "Matières premières / métaux // précieux" (autre modalité d'exposition aux matières premières, ex. en unités de compte // d'assurance-vie). Rattaché aux mêmes enveloppes que "Fonds monétaires" ci-dessus (menu de // supports déjà large) ; PEA/PEA-PME exclus, comme en pratique un ETC matières premières // physiques n'est pas éligible au PEA. Toujours exécuté (INSERT OR IGNORE, clés UNIQUE sur nom). { db.prepare("INSERT OR IGNORE INTO supports_referentiel (nom, description) VALUES (?, ?)").run( 'ETC (Exchange Traded Commodities)', "Tracker coté sur une matière première (or, pétrole, panier de matières premières...) — proche de l'ETF dans sa mécanique de cotation, mais sans statut UCITS/OPCVM ; distinct du support « ETF / trackers » et de « Matières premières / métaux précieux »." ); const getSuppRefIdEtc = db.prepare('SELECT id FROM supports_referentiel WHERE nom = ?'); const suppEtc = getSuppRefIdEtc.get('ETC (Exchange Traded Commodities)'); if (suppEtc) { const getEnvRefIdEtc = db.prepare('SELECT id FROM enveloppes_referentiel WHERE nom = ?'); const linkEnvSuppEtc = db.prepare('INSERT OR IGNORE INTO enveloppes_supports_disponibles (enveloppe_id, support_id) VALUES (?, ?)'); 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 = getEnvRefIdEtc.get(envNom); if (env) linkEnvSuppEtc.run(env.id, suppEtc.id); } } } export default db; ''' content = content.replace(anchor, block, 1) with open(path, "w", encoding="utf-8") as f: f.write(content) print("Support ETC inserted OK, new length:", len(content))