feat(ce): Sprint H — signup CE public + /espace-ce shell #82
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/ce-sprint-h"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Sprint H — Signup CE public +
/espace-ceshellSuite 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 CEgetCurrentCeOrganization()— CE_MANAGER → son org ; ADMIN → org ciblée ou nullcanManageCarbetForCe()— vrai si owner direct OU CE_MANAGER d'une org liée via membershiprequireApprovedOrg()— redirect /espace-ce?pending=1 si org pas validéeEmails
sendNewCeRequest(orgName, managerEmail)→ contact@karbe.cosmolan.fr avec deep-link/admin/organizations?status=pendingsendCeApproved(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 champorgName, layout grid 4 colonnes sur lg/api/signup: zod accepte CE_MANAGER + orgName ; transaction$txatomique crée Organization (approved=false, slug auto-unique viaslugify+ suffix-2/-3…) + User (role=CE_MANAGER, organizationId lié)Dashboard
/espace-celayout.tsx:requirePluginOr404("ce-management")+requireCeManagerSessionpage.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 Jsrc/lib/ce-dashboard.ts:getCeOrgKpis()agrège bookings carbets (via memberships) + RentalBookings (viaprovider.organizationId)SiteHeader: lien « Espace CE » conditionné par role + pluginTest plan
npm test53/53 ✓ce-managementpuis signup CE via/inscription→ user créé + org pending + email dry-run/espace-ceaccessible avec bannière amber/admin/organizations/[id]→ email dry-runsendCeApprovedenvoyé + bannière disparaît au reloadcetest,cetest-2🤖 Generated with Claude Code
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>