From add66a93108d582ff5ffedd2cb33410e17a69504 Mon Sep 17 00:00:00 2001 From: Olivier Date: Sat, 26 Sep 2026 18:48:18 +0200 Subject: [PATCH] fix --- backend/src/routes/admin.js | 20 ++++++++++++++---- .../icones institutions/Credit agricole.webp | Bin 0 -> 9264 bytes frontend/src/pages/AdminInstitutions.jsx | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 design/icones institutions/Credit agricole.webp diff --git a/backend/src/routes/admin.js b/backend/src/routes/admin.js index 009bb78..878c2c1 100644 --- a/backend/src/routes/admin.js +++ b/backend/src/routes/admin.js @@ -842,20 +842,32 @@ router.post('/exports/:filename/restore', async (req, res, next) => { /** Liste les valeurs `banque` distinctes non reliées à institution_id, avec suggestion */ router.get('/comptes-orphelins', (_req, res) => { + // Groupé par (banque, user_id, investisseur_id) : `user_id` est le compte de connexion + // (potentiellement partagé par toute une famille — cf. `investisseurs`), `investisseur_id` + // le détenteur réel du compte bancaire (Olivier, Marine, Clément...). Sans ce second niveau, + // tous les comptes d'une même famille apparaissent à tort sous le seul nom du titulaire du + // compte de connexion (constaté par Olivier le 26/09/26). const rows = db.prepare(` - SELECT c.banque, u.id AS user_id, u.email AS user_email, u.display_name AS user_display_name, COUNT(*) AS nb + SELECT c.banque, u.id AS user_id, u.email AS user_email, u.display_name AS user_display_name, + c.investisseur_id, i.nom AS investisseur_nom, + COUNT(*) AS nb FROM comptes c JOIN users u ON u.id = c.user_id + LEFT JOIN investisseurs i ON i.id = c.investisseur_id WHERE c.institution_id IS NULL AND c.banque IS NOT NULL AND TRIM(c.banque) != '' - GROUP BY c.banque, u.id - ORDER BY c.banque, u.email + GROUP BY c.banque, u.id, c.investisseur_id + ORDER BY c.banque, i.nom, u.email `).all(); const byBanque = {}; for (const r of rows) { if (!byBanque[r.banque]) byBanque[r.banque] = { banque: r.banque, total: 0, users: [] }; byBanque[r.banque].total += r.nb; - byBanque[r.banque].users.push({ id: r.user_id, email: r.user_email, display_name: r.user_display_name, nb: r.nb }); + byBanque[r.banque].users.push({ + id: r.user_id, email: r.user_email, display_name: r.user_display_name, + investisseur_id: r.investisseur_id, investisseur_nom: r.investisseur_nom, + nb: r.nb, + }); } const refs = db.prepare('SELECT id, nom FROM institutions_referentiel ORDER BY nom').all(); diff --git a/design/icones institutions/Credit agricole.webp b/design/icones institutions/Credit agricole.webp new file mode 100644 index 0000000000000000000000000000000000000000..a5688369357f887fba8350d14191d9b60e666483 GIT binary patch literal 9264 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 SlpzY27S?auNeVvPPyhhk5*^+E literal 0 HcmV?d00001 diff --git a/frontend/src/pages/AdminInstitutions.jsx b/frontend/src/pages/AdminInstitutions.jsx index 855adcd..8fc76d2 100644 --- a/frontend/src/pages/AdminInstitutions.jsx +++ b/frontend/src/pages/AdminInstitutions.jsx @@ -811,7 +811,10 @@ function ComptesOrphelinsSection() { )} - {row.total} compte{row.total > 1 ? 's' : ''} — {row.users.map(u => u.display_name || u.email).join(', ')} + {row.total} compte{row.total > 1 ? 's' : ''} — {row.users.map(u => { + const label = u.investisseur_nom || 'Non attribué'; + return u.nb > 1 ? `${label} (${u.nb})` : label; + }).join(', ')}