feat(ce): Sprint J — matériel rental côté CE #84
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/ce-sprint-j"
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 J — Matériel rental côté CE
Suite du plan CE management (Sprint G/H/I déjà mergés). Permet à un CE_MANAGER d'activer un
RentalProviderorg-scoped, puis de gérer items + réservations.src/lib/rental-access.tsCE-awarerequireRentalProviderSessionaccepte désormais CE_MANAGERgetCurrentRentalProvider: CE_MANAGER →findFirst({ organizationId }), sinon RENTAL_PROVIDER →findFirst({ managedByUserId })getCurrentRentalProviderForCe(orgId)helper explicite pour l'onboardingcanManageRentalProvider(userId, role, providerId, userOrgId?)étendu : vrai si manager nominal OU CE_MANAGER +provider.organizationId === userOrgIdsession.user.organizationIdActions
/espace-prestataire/actions.tsrole-awarerequireOwnedProvider()dérive unbasePathselon le rôle :/espace-ce/materiel/espace-prestataireTous les
redirect/revalidatePathde createHost/updateHost/deleteHost/addItemBlock/removeItemBlock/updateBookingStatus utilisentbasePath— l'utilisateur reste dans son contexte après chaque opération./espace-ce/materiel/page.tsx— onboarding & dashboardgear-rentaldésactivé → message d'infoactivateRentalProviderForCeActionCrée
RentalProvider(organizationId, name="Matériel <org>", managedByUserId=session.user.id, approved=true)+ audit log + redirect. Bloque si org pas validée.Pages clonées (zéro duplication métier)
/espace-ce/materiel/items/page.tsx/espace-ce/materiel/items/new/page.tsx/espace-ce/materiel/items/[itemId]/page.tsx(MediaUploader + form + ItemBlocksManager)/espace-ce/materiel/reservations/page.tsxTous importent depuis
/espace-prestataire/{actions, items, reservations}pour réutiliser les composants et la logique métier. Seuls les breadcrumbs/links diffèrent.Test plan
npm test53/53 ✓gear-rentalactivé →/espace-ce/materielmontre CTA Activer/espace-ce/materiel/items/[id]/espace-prestataire/*inchangé (régression zéro)🤖 Generated with Claude Code
src/lib/rental-access.ts CE-aware : - requireRentalProviderSession accepte CE_MANAGER (en plus de RENTAL_PROVIDER et ADMIN). - getCurrentRentalProvider : CE_MANAGER → findFirst par organizationId ; RENTAL_PROVIDER → par managedByUserId. - getCurrentRentalProviderForCe(organizationId) helper explicite. - canManageRentalProvider gagne un userOrgId? optionnel : vrai si manager nominal OU CE_MANAGER + provider.organizationId === userOrgId. - Callers existants (5 sites : actions.ts + 4 routes API rental) passent désormais session.user.organizationId. Actions /espace-prestataire/actions.ts role-aware : - requireOwnedProvider() dérive basePath selon le rôle : CE_MANAGER → /espace-ce/materiel ; sinon → /espace-prestataire. - Tous les redirect/revalidatePath utilisent basePath, donc createHostItemAction, updateHostItemAction, deleteHostItemAction, addItemBlockAction, removeItemBlockAction, updateBookingStatusAction emmènent le user vers son espace contextuel après chaque opération. /espace-ce/materiel/page.tsx — onboarding : - Plugin gear-rental disabled → message d'info. - Pas de provider activé → CTA « Activer la location matériel pour <org> » (bouton bloqué si org pending, message bannière). - Provider existant → dashboard avec KPIs (items actifs, résa pending, confirmées à venir, revenu 30j) + 2 ActionCards Items + Réservations. actions.ts (CE) : - activateRentalProviderForCeAction → crée RentalProvider(organizationId, name="Matériel <org>", managedByUserId=session.user.id, approved=true) + audit + redirect /espace-ce/materiel. Pages CE clonées (réutilisent les composants, actions, helpers existants — zéro duplication de logique métier) : - /espace-ce/materiel/items/page.tsx (liste) - /espace-ce/materiel/items/new/page.tsx (HostItemForm) - /espace-ce/materiel/items/[itemId]/page.tsx (MediaUploader + HostItemForm + ItemBlocksManager + ItemInlineDelete) - /espace-ce/materiel/reservations/page.tsx (BookingDecision) Tous importent depuis /espace-prestataire/{actions, items, reservations} pour rester DRY. Les breadcrumbs et links sont adaptés au contexte CE. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>