This commit is contained in:
ocroguennec committed 2026-09-26 18:48:18 +02:00
1 parent b18ffc63ee
commit add66a9310
3 files changed
+20 -5

No files matched your search

+16 -4
View File
@@ -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();
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

+4 -1
View File
@@ -811,7 +811,10 @@ function ComptesOrphelinsSection() {
)}
</td>
<td style={{ padding: '10px 8px', color: 'var(--text-muted)', fontSize: 12 }}>
{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(', ')}
</td>
<td style={{ padding: '10px 8px' }}>
<select