feat(ce): Sprint L — email auto invites + admin memberships UI #86

Merged
tarzzan merged 1 commit from feat/ce-sprint-l into main 2026-06-03 01:59:54 +00:00
Owner

Sprint L — Email auto invites + admin memberships UI

Clean-up des loose ends du module CE management (Sprints G→K).

Email automatique pour les invites CE_MEMBER

  • sendCeInviteEmail(to, orgName, inviteUrl, inviterName?) — template best-effort (dry-run sans Resend), bouton CTA + lien direct en plain text, mention TTL 14j + warning si pas le destinataire attendu
  • createInviteAction branche l'envoi automatique quand un email est renseigné dans le formulaire ; audit log gagne emailedAutomatically
  • InviteForm UI : affiche « lien généré · email envoyé » quand un email était fourni
  • Sans email → comportement inchangé (lien à copier manuellement)

Avant : le CE_MANAGER générait un lien et devait le copier dans son outil de messagerie. Maintenant : il met un email → le destinataire reçoit le mail directement.

Admin /admin/carbets/[id] : section memberships orgs

  • src/lib/admin/carbets.ts :
    • getCarbetForEdit inclut désormais organizations (memberships) avec leurs orgs
    • Nouveau helper listOrganizationsForLink() (toutes orgs triées approved desc)
  • 2 actions admin :
    • linkCarbetToOrganizationAction(carbetId, orgId) — idempotent (re-link sur paire existante = no-op)
    • unlinkCarbetFromOrganizationAction(carbetId, orgId)
    • Audit scope=admin.carbets, events carbet.org.link / carbet.org.unlink
  • <CarbetMemberships /> client component : liste les orgs liées (badge « pending » si org non approuvée) + select des orgs disponibles (filtre auto les orgs déjà liées) + boutons Lier/Délier + état désactivé quand tout est lié

Permet maintenant de :

  • Lier rétroactivement un carbet existant à un CE (cas où l'organisation intègre un carbet d'un hôte individuel)
  • Délier un carbet quand un CE part ou que le carbet repasse en gestion individuelle

Test plan

  • npm test 62/62 ✓
  • typecheck / lint / build ✓
  • CE_MANAGER avec org validée → /espace-ce/membres → formulaire avec email rempli → submit → vérifier log email dry-run + UI affiche « email envoyé »
  • Sans email → comportement actuel (lien à copier)
  • ADMIN → /admin/carbets/[id] → section « Organisations co-gestionnaires (CE) » → select + bouton Lier → membership créé → audit log
  • Bouton Délier → membership supprimé → audit log
  • Lier 2 fois la même org → idempotent (alreadyLinked=true)

🤖 Generated with Claude Code

## Sprint L — Email auto invites + admin memberships UI Clean-up des loose ends du module CE management (Sprints G→K). ### Email automatique pour les invites CE_MEMBER - `sendCeInviteEmail(to, orgName, inviteUrl, inviterName?)` — template best-effort (dry-run sans Resend), bouton CTA + lien direct en plain text, mention TTL 14j + warning si pas le destinataire attendu - `createInviteAction` branche l'envoi automatique quand un email est renseigné dans le formulaire ; audit log gagne `emailedAutomatically` - `InviteForm` UI : affiche « lien généré · email envoyé » quand un email était fourni - Sans email → comportement inchangé (lien à copier manuellement) Avant : le CE_MANAGER générait un lien et devait le copier dans son outil de messagerie. Maintenant : il met un email → le destinataire reçoit le mail directement. ### Admin `/admin/carbets/[id]` : section memberships orgs - `src/lib/admin/carbets.ts` : - `getCarbetForEdit` inclut désormais `organizations` (memberships) avec leurs orgs - Nouveau helper `listOrganizationsForLink()` (toutes orgs triées `approved desc`) - 2 actions admin : - `linkCarbetToOrganizationAction(carbetId, orgId)` — idempotent (re-link sur paire existante = no-op) - `unlinkCarbetFromOrganizationAction(carbetId, orgId)` - Audit scope=`admin.carbets`, events `carbet.org.link` / `carbet.org.unlink` - `<CarbetMemberships />` client component : liste les orgs liées (badge « pending » si org non approuvée) + select des orgs disponibles (filtre auto les orgs déjà liées) + boutons Lier/Délier + état désactivé quand tout est lié Permet maintenant de : - Lier rétroactivement un carbet existant à un CE (cas où l'organisation intègre un carbet d'un hôte individuel) - Délier un carbet quand un CE part ou que le carbet repasse en gestion individuelle ### Test plan - [x] `npm test` 62/62 ✓ - [x] typecheck / lint / build ✓ - [ ] CE_MANAGER avec org validée → `/espace-ce/membres` → formulaire avec email rempli → submit → vérifier log email dry-run + UI affiche « email envoyé » - [ ] Sans email → comportement actuel (lien à copier) - [ ] ADMIN → `/admin/carbets/[id]` → section « Organisations co-gestionnaires (CE) » → select + bouton Lier → membership créé → audit log - [ ] Bouton Délier → membership supprimé → audit log - [ ] Lier 2 fois la même org → idempotent (alreadyLinked=true) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
tarzzan added 1 commit 2026-06-03 01:59:52 +00:00
feat(ce): Sprint L — email auto invites + admin memberships UI
All checks were successful
CI / test (pull_request) Successful in 2m39s
3a557b6de5
Email automatique pour les invites CE_MEMBER :
- sendCeInviteEmail(to, orgName, inviteUrl, inviterName?) : template
  best-effort (dry-run sans Resend), bouton CTA + lien direct en plain
  text. Mentionne TTL 14j + warning si pas le destinataire attendu.
- createInviteAction branche l'envoi automatique quand un email est
  renseigné dans le formulaire. Audit log gagne emailedAutomatically.
- InviteForm UI : affiche « lien généré · email envoyé » quand un
  email était fourni. Texte d'aide mis à jour.
- Sans email → comportement inchangé : lien à copier manuellement.

Admin /admin/carbets/[id] gagne section memberships :
- src/lib/admin/carbets.ts : getCarbetForEdit inclut organizations +
  listOrganizationsForLink helper (toutes orgs triées approved desc).
- 2 actions admin : linkCarbetToOrganizationAction (idempotent) +
  unlinkCarbetFromOrganizationAction. Audit scope=admin.carbets,
  events carbet.org.link / carbet.org.unlink.
- CarbetMemberships client component : liste les orgs liées (badge
  pending si org non approuvée) + select des orgs disponibles + boutons
  Lier/Délier. Désactive le select quand toutes les orgs sont déjà
  liées.

Le link admin permet de :
- Lier rétroactivement un carbet existant à un CE (cas où l'orga
  intègre un carbet d'un hôte individuel).
- Délier un carbet quand un CE part ou que le carbet repasse en
  gestion individuelle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tarzzan merged commit 7a12848b5b into main 2026-06-03 01:59:54 +00:00
tarzzan deleted branch feat/ce-sprint-l 2026-06-03 01:59:54 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: tarzzan/karbe#86
No description provided.