Reférentiel des institutions financières
This commit is contained in:
1 parent
f2bdf29b16
commit
1dcb33aa74
19 files changed
+1265
No files matched your search
@@ -3524,4 +3524,137 @@ db.exec(`
|
||||
`);
|
||||
db.exec('CREATE INDEX IF NOT EXISTS idx_pe_pertes_inv ON investissement_pe_pertes(investissement_pe_id)');
|
||||
|
||||
// ── Chantier "Référentiel Institutions financières" (26/09/26, demande Olivier) ──────────
|
||||
// Catalogue admin de banques/courtiers/assureurs, sur le modèle de plateformes_referentiel
|
||||
// (cf. project_referentiel_plateformes.md) mais SANS les champs spécifiques aux plateformes
|
||||
// d'investissement (fiscalité, produit fiscal, frais...) et SANS rattachement workspace : une
|
||||
// institution financière est transverse à tous les espaces de travail (décision d'Olivier,
|
||||
// AskUserQuestion 26/09/26). Phase 1 uniquement : catalogue admin (logos/icônes/catégories).
|
||||
// Le rattachement à comptes.banque (Phase 2) fera l'objet d'un chantier séparé — cf. plan de
|
||||
// déploiement (doc projet claude/plan_referentiel_institutions_financieres.md).
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS institutions_referentiel (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
nom TEXT NOT NULL UNIQUE,
|
||||
url TEXT,
|
||||
domiciliation TEXT NOT NULL DEFAULT 'FR',
|
||||
description TEXT,
|
||||
logo_filename TEXT,
|
||||
icone_filename TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
db.exec('CREATE INDEX IF NOT EXISTS idx_instref_nom ON institutions_referentiel(nom)');
|
||||
|
||||
// Catégories (axe unique "type d'établissement"), gérées par l'admin — même patron que
|
||||
// categories_inv/referentiel_categories_inv (cf. plus haut) mais table dédiée : une catégorie
|
||||
// d'établissement financier (Banque, Assureur...) n'a pas de sens pour une plateforme
|
||||
// crowdlending/PE, on évite donc de mélanger les deux taxonomies.
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS categories_institutions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
nom TEXT NOT NULL UNIQUE,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS referentiel_categories_institutions (
|
||||
institution_id INTEGER NOT NULL REFERENCES institutions_referentiel(id) ON DELETE CASCADE,
|
||||
categorie_id INTEGER NOT NULL REFERENCES categories_institutions(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (institution_id, categorie_id)
|
||||
)
|
||||
`);
|
||||
|
||||
// Seed initial des catégories (idempotent — n'insère que si la table est vide ; l'admin reste
|
||||
// libre de renommer/supprimer ensuite depuis l'écran dédié).
|
||||
{
|
||||
const catInstCount = db.prepare('SELECT COUNT(*) AS n FROM categories_institutions').get().n;
|
||||
if (catInstCount === 0) {
|
||||
const insCatInst = db.prepare('INSERT OR IGNORE INTO categories_institutions (nom) VALUES (?)');
|
||||
db.transaction(() => {
|
||||
for (const nom of ['Banque', 'Néobanque', 'Courtier', 'Assureur', 'Société de gestion', 'Établissement de paiement', 'Autre']) {
|
||||
insCatInst.run(nom);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Seed initial des institutions financières (proposition validée par Olivier le 26/09/26,
|
||||
// via ajustements sur la liste par défaut) — idempotent, n'insère que si la table est vide.
|
||||
// Chaque institution peut porter plusieurs catégories (ex. Trade Republic : Néobanque + Courtier).
|
||||
{
|
||||
const instRefCount = db.prepare('SELECT COUNT(*) AS n FROM institutions_referentiel').get().n;
|
||||
if (instRefCount === 0) {
|
||||
const SEED_INSTITUTIONS = [
|
||||
{ nom: 'BNP Paribas', categories: ['Banque'] },
|
||||
{ nom: 'Société Générale', categories: ['Banque'] },
|
||||
{ nom: 'Crédit Agricole', categories: ['Banque'] },
|
||||
{ nom: 'Banque Populaire', categories: ['Banque'] },
|
||||
{ nom: "Caisse d'Épargne", categories: ['Banque'] },
|
||||
{ nom: 'Crédit Mutuel', categories: ['Banque'] },
|
||||
{ nom: 'CIC', categories: ['Banque'] },
|
||||
{ nom: 'La Banque Postale', categories: ['Banque'] },
|
||||
{ nom: 'LCL', categories: ['Banque'] },
|
||||
{ nom: 'HSBC Continental Europe (CCF)', categories: ['Banque'] },
|
||||
{ nom: 'Boursorama Banque', categories: ['Néobanque'] },
|
||||
{ nom: 'Hello bank!', categories: ['Néobanque'] },
|
||||
{ nom: 'Fortuneo', categories: ['Néobanque'] },
|
||||
{ nom: 'BforBank', categories: ['Néobanque'] },
|
||||
{ nom: 'Monabanq', categories: ['Néobanque'] },
|
||||
{ nom: 'N26', categories: ['Néobanque'] },
|
||||
{ nom: 'Revolut', categories: ['Néobanque'] },
|
||||
{ nom: 'Qonto', categories: ['Néobanque'] },
|
||||
{ nom: 'Trade Republic', categories: ['Néobanque', 'Courtier'] },
|
||||
{ nom: 'Saxo Banque France', categories: ['Néobanque'] },
|
||||
{ nom: 'Wise', categories: ['Néobanque'] },
|
||||
{ nom: 'Bourse Direct', categories: ['Courtier'] },
|
||||
{ nom: 'DEGIRO', categories: ['Courtier'] },
|
||||
{ nom: 'Interactive Brokers', categories: ['Courtier'] },
|
||||
{ nom: 'EasyBourse', categories: ['Courtier'] },
|
||||
{ nom: 'AXA France', categories: ['Assureur'] },
|
||||
{ nom: 'Allianz France', categories: ['Assureur'] },
|
||||
{ nom: 'Generali France', categories: ['Assureur'] },
|
||||
{ nom: 'CNP Assurances', categories: ['Assureur'] },
|
||||
{ nom: 'MAIF', categories: ['Assureur'] },
|
||||
{ nom: 'MACIF', categories: ['Assureur'] },
|
||||
{ nom: 'Groupama', categories: ['Assureur'] },
|
||||
{ nom: 'Crédit Agricole Assurances (Predica)', categories: ['Assureur'] },
|
||||
{ nom: 'BNP Paribas Cardif', categories: ['Assureur'] },
|
||||
{ nom: 'Société Générale Assurances (Sogecap)', categories: ['Assureur'] },
|
||||
{ nom: 'Swiss Life France', categories: ['Assureur'] },
|
||||
{ nom: 'Abeille Assurances (ex-Aviva France)', categories: ['Assureur'] },
|
||||
{ nom: 'Suravenir (Crédit Mutuel Arkéa)', categories: ['Assureur'] },
|
||||
{ nom: 'Spirica', categories: ['Assureur'] },
|
||||
{ nom: 'Amundi', categories: ['Société de gestion'] },
|
||||
{ nom: 'Natixis Investment Managers', categories: ['Société de gestion'] },
|
||||
{ nom: 'BNP Paribas Asset Management', categories: ['Société de gestion'] },
|
||||
{ nom: 'Lazard Frères Gestion', categories: ['Société de gestion'] },
|
||||
{ nom: 'Carmignac', categories: ['Société de gestion'] },
|
||||
{ nom: 'Tikehau Capital', categories: ['Société de gestion'] },
|
||||
{ nom: "La Financière de l'Échiquier", categories: ['Société de gestion'] },
|
||||
{ nom: 'Eiffel Investment Group', categories: ['Société de gestion'] },
|
||||
{ nom: 'Lydia (Sumeria)', categories: ['Établissement de paiement'] },
|
||||
{ nom: 'PayPal', categories: ['Établissement de paiement'] },
|
||||
{ nom: 'Nickel', categories: ['Établissement de paiement'] },
|
||||
];
|
||||
const insInstRef = db.prepare('INSERT OR IGNORE INTO institutions_referentiel (nom) VALUES (?)');
|
||||
const getInstRefId = db.prepare('SELECT id FROM institutions_referentiel WHERE nom = ?');
|
||||
const getCatInstId = db.prepare('SELECT id FROM categories_institutions WHERE nom = ?');
|
||||
const linkInstCat = db.prepare('INSERT OR IGNORE INTO referentiel_categories_institutions (institution_id, categorie_id) VALUES (?, ?)');
|
||||
db.transaction(() => {
|
||||
for (const { nom, categories } of SEED_INSTITUTIONS) {
|
||||
insInstRef.run(nom);
|
||||
const inst = getInstRefId.get(nom);
|
||||
if (!inst) continue;
|
||||
for (const catNom of categories) {
|
||||
const cat = getCatInstId.get(catNom);
|
||||
if (cat) linkInstCat.run(inst.id, cat.id);
|
||||
}
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
export default db;
|
||||
Reference in new issue
Block a user