diff --git a/src/app/dashboard/events/[id]/page.tsx b/src/app/dashboard/events/[id]/page.tsx
index 5b1d82c..925c99f 100644
--- a/src/app/dashboard/events/[id]/page.tsx
+++ b/src/app/dashboard/events/[id]/page.tsx
@@ -49,6 +49,7 @@ import {
getEventWithDetails,
getMeetingAttendance,
nomPresent,
+ telephonePresent,
} from "@/lib/data";
import { formatDateTime, toDatetimeLocal } from "@/lib/dates";
import { formatEurosAbsolute } from "@/lib/money";
@@ -285,20 +286,35 @@ export default async function EventDetailPage({
{gens.length === 0 ? (
Personne pour l’instant.
) : (
-
- {gens.map((r) => (
- -
- {nomPresent(r)}
- {/* Un parent sans compte a répondu par le lien public :
- le dire évite de le chercher dans l'annuaire des
- membres, et rappelle que la réunion est ouverte. */}
- {!r.userId && (
-
- invité
-
- )}
-
- ))}
+
+ {gens.map((r) => {
+ const telephone = telephonePresent(r);
+ return (
+ -
+ {nomPresent(r)}
+ {/* Un parent sans compte a répondu par le lien
+ public : le dire évite de le chercher dans
+ l'annuaire des membres, et rappelle que la
+ réunion est ouverte. */}
+ {!r.userId && (
+
+ invité
+
+ )}
+ {/* Cliquable : celui qui consulte cette liste pour
+ relancer quelqu'un est le plus souvent sur son
+ téléphone, la veille de la réunion. */}
+ {telephone && (
+
+ {telephone}
+
+ )}
+
+ );
+ })}
)}
diff --git a/src/lib/data.ts b/src/lib/data.ts
index ede2817..c4ebfce 100644
--- a/src/lib/data.ts
+++ b/src/lib/data.ts
@@ -154,7 +154,15 @@ export async function getMeetingAttendance(eventId: string) {
return db.query.meetingAttendance.findMany({
where: eq(meetingAttendance.eventId, eventId),
orderBy: [asc(meetingAttendance.createdAt)],
- with: { user: { columns: { id: true, name: true } } },
+ with: {
+ user: {
+ columns: { id: true, name: true },
+ // Un compte n'a pas de téléphone ; sa fiche d'adhérent, si elle est
+ // rattachée, en porte un. C'est le seul numéro d'un membre que
+ // l'association détient — le chercher ailleurs serait le deviner.
+ with: { associationMember: { columns: { phone: true } } },
+ },
+ },
});
}
@@ -166,6 +174,19 @@ export function nomPresent(reponse: {
return reponse.user?.name ?? reponse.name ?? "Sans nom";
}
+/**
+ * Le téléphone auquel joindre quelqu'un qui a répondu : celui qu'il a saisi
+ * s'il est venu par le lien public, sinon celui de sa fiche d'adhérent.
+ * `null` quand l'association n'en connaît pas — la plupart des membres.
+ */
+export function telephonePresent(reponse: {
+ phone: string | null;
+ user: { associationMember: { phone: string | null } | null } | null;
+}): string | null {
+ const numero = reponse.phone ?? reponse.user?.associationMember?.phone ?? null;
+ return numero?.trim() || null;
+}
+
/** Une présence annoncée publiquement, via son jeton de retrait. */
export async function getMeetingAttendanceByCancelToken(token: string) {
return db.query.meetingAttendance.findFirst({