feat(ce): Sprint H — signup CE public + /espace-ce shell #82

Merged
tarzzan merged 1 commit from feat/ce-sprint-h into main 2026-06-02 23:13:16 +00:00
Owner

Sprint H — Signup CE public + /espace-ce shell

Suite du plan CE management (Sprint G a livré le schema + admin validation).

src/lib/ce-access.ts (NEW)

  • requireCeManagerSession() — guard d'accès aux pages CE
  • getCurrentCeOrganization() — CE_MANAGER → son org ; ADMIN → org ciblée ou null
  • canManageCarbetForCe() — vrai si owner direct OU CE_MANAGER d'une org liée via membership
  • requireApprovedOrg() — redirect /espace-ce?pending=1 si org pas validée

Emails

  • sendNewCeRequest(orgName, managerEmail)contact@karbe.cosmolan.fr avec deep-link /admin/organizations?status=pending
  • sendCeApproved(email, firstName, orgName) → envoyé à tous les CE_MANAGERs actifs de l'org après validation par l'admin (best-effort, log si échec)

Signup CE public

  • SignupForm : 4e tuile « Comité d'Entreprise » avec champ orgName, layout grid 4 colonnes sur lg
  • /api/signup : zod accepte CE_MANAGER + orgName ; transaction $tx atomique crée Organization (approved=false, slug auto-unique via slugify + suffix -2/-3…) + User (role=CE_MANAGER, organizationId lié)

Dashboard /espace-ce

  • layout.tsx : requirePluginOr404("ce-management") + requireCeManagerSession
  • page.tsx : 4 KPIs (carbets co-gérés, items rental, bookings 30j, revenu 30j), bannière amber « En attente de validation » si pending, 2 ActionCards « Mes carbets » + « Matériel rental » marquées « Bientôt » jusqu'aux sprints I et J
  • src/lib/ce-dashboard.ts : getCeOrgKpis() agrège bookings carbets (via memberships) + RentalBookings (via provider.organizationId)
  • SiteHeader : lien « Espace CE » conditionné par role + plugin

Test plan

  • npm test 53/53 ✓
  • typecheck / lint / build ✓
  • Activer le plugin ce-management puis signup CE via /inscription → user créé + org pending + email dry-run
  • Connexion comme CE_MANAGER → /espace-ce accessible avec bannière amber
  • Admin valide via /admin/organizations/[id] → email dry-run sendCeApproved envoyé + bannière disparaît au reload
  • Slug collision : deux signups avec orgName identique → slugs cetest, cetest-2

🤖 Generated with Claude Code

## Sprint H — Signup CE public + `/espace-ce` shell Suite du plan CE management (Sprint G a livré le schema + admin validation). ### `src/lib/ce-access.ts` (NEW) - `requireCeManagerSession()` — guard d'accès aux pages CE - `getCurrentCeOrganization()` — CE_MANAGER → son org ; ADMIN → org ciblée ou null - `canManageCarbetForCe()` — vrai si owner direct OU CE_MANAGER d'une org liée via membership - `requireApprovedOrg()` — redirect /espace-ce?pending=1 si org pas validée ### Emails - `sendNewCeRequest(orgName, managerEmail)` → contact@karbe.cosmolan.fr avec deep-link `/admin/organizations?status=pending` - `sendCeApproved(email, firstName, orgName)` → envoyé à **tous les CE_MANAGERs actifs** de l'org après validation par l'admin (best-effort, log si échec) ### Signup CE public - `SignupForm` : 4e tuile « Comité d'Entreprise » avec champ `orgName`, layout grid 4 colonnes sur lg - `/api/signup` : zod accepte CE_MANAGER + orgName ; transaction `$tx` atomique crée Organization (approved=false, slug auto-unique via `slugify` + suffix `-2/-3…`) + User (role=CE_MANAGER, organizationId lié) ### Dashboard `/espace-ce` - `layout.tsx` : `requirePluginOr404("ce-management")` + `requireCeManagerSession` - `page.tsx` : 4 KPIs (carbets co-gérés, items rental, bookings 30j, revenu 30j), bannière amber « En attente de validation » si pending, 2 ActionCards « Mes carbets » + « Matériel rental » marquées « Bientôt » jusqu'aux sprints I et J - `src/lib/ce-dashboard.ts` : `getCeOrgKpis()` agrège bookings carbets (via memberships) + RentalBookings (via `provider.organizationId`) - `SiteHeader` : lien « Espace CE » conditionné par role + plugin ### Test plan - [x] `npm test` 53/53 ✓ - [x] typecheck / lint / build ✓ - [ ] Activer le plugin `ce-management` puis signup CE via `/inscription` → user créé + org pending + email dry-run - [ ] Connexion comme CE_MANAGER → `/espace-ce` accessible avec bannière amber - [ ] Admin valide via `/admin/organizations/[id]` → email dry-run `sendCeApproved` envoyé + bannière disparaît au reload - [ ] Slug collision : deux signups avec orgName identique → slugs `cetest`, `cetest-2` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
tarzzan added 1 commit 2026-06-02 23:13:14 +00:00
feat(ce): Sprint H — signup CE public + /espace-ce shell
All checks were successful
CI / test (pull_request) Successful in 2m33s
63a29d9ade
src/lib/ce-access.ts (NEW) :
- requireCeManagerSession (redirect connexion ou / si rôle insuffisant)
- getCurrentCeOrganization (CE_MANAGER → son org via organizationId,
  ADMIN → org ciblée par paramètre ou null)
- canManageCarbetForCe (owner direct OU membre d'une org liée)
- requireApprovedOrg (redirect /espace-ce?pending=1 si non validée)

Emails best-effort :
- sendNewCeRequest → admin (contact@karbe) avec lien filtré
  /admin/organizations?status=pending
- sendCeApproved → CE_MANAGERs actifs de l'org après validation
- Branchement dans approveOrganizationAction : envoie le mail à tous
  les CE_MANAGERs actifs de l'org en best-effort.

Signup CE public :
- SignupForm 4e tuile « Comité d'Entreprise » avec champ orgName.
  Layout grid 4 colonnes sur lg, 2 sur sm.
- /api/signup étendu :
  - zod accepte CE_MANAGER + orgName
  - transaction $tx atomique : Organization (approved=false, slug
    auto-unique via slugify + suffix) + User (role=CE_MANAGER,
    organizationId lié)
  - sendNewCeRequest best-effort
  - réponse étendue avec organizationId
- Pattern slug : retry avec suffix -2, -3… jusqu'à libre

Dashboard /espace-ce :
- layout.tsx : requirePluginOr404("ce-management") +
  requireCeManagerSession
- page.tsx : 4 KPIs (carbets co-gérés, items rental, bookings 30j,
  revenu 30j), bannière « En attente de validation » si pending,
  2 ActionCards (Mes carbets, Matériel rental) marquées « Bientôt »
  jusqu'aux sprints I et J
- ce-dashboard.ts : getCeOrgKpis (agrège bookings carbets via
  membership + rentalBookings via provider.organizationId) +
  listCeCarbets pour Sprint I

SiteHeader : lien « Espace CE » conditionné par role + plugin
(mirror du lien Espace prestataire).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tarzzan merged commit 3d77632ba0 into main 2026-06-02 23:13:16 +00:00
tarzzan deleted branch feat/ce-sprint-h 2026-06-02 23:13:16 +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#82
No description provided.