feat(rental): Sprint D — panier + checkout + carbet integration #77
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/rental-sprint-d"
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 D — Panier + checkout + intégration carbet
Sous-marketplace de location de matériel, étape 4/5 : flux complet panier → paiement → confirmation, plus l'intégration côté carbet et la page récap pour le locataire.
Cart (cookie + React Context)
src/lib/rental-cart.ts: schéma Zod, EMPTY_CART, parseCart/serializeCart, diffDayssrc/lib/rental-cart-server.ts: read/write cookie côté serveursrc/components/RentalCartProvider.tsx: context + useCart() (add/remove/update/clear), persistance auto<RentalCartProvider initial={cookie}>wrappé danslayout.tsx(hydratation server→client)UI panier
/panier— récap regroupé par prestataire, sous-totaux, caution<AddToCart />sur/materiel/[itemId](date picker + qté + feedback)SiteHeaderavec compteur (visible quand panier non vide)API checkout
POST /api/rentals/checkout:provider.commissionPct{type:"rental-bundle", rentalBookingIds:[...]}rentalBookingIdsrental.checkout.createdcheckout.session.completedtype=rental-bundle→updateManyCONFIRMED+SUCCEEDEDpayment_intent.payment_failedmetadata.rentalBookingIds→ CANCELLED + suppression desRentalItemAvailability(libère le stock)Intégration carbet
/carbets/[slug]: nouveau panneau « Compléter votre séjour » qui recommande les items des prestataires de la même rivière + System D/reservations/[id]: nouvelle section « Matériel associé » qui liste les RentalBookings liées au booking carbet/mes-locations: page récap toutes les locations du tenant (System D + tiers, liées carbet ou standalone), avec contact prestataire affiché une fois CONFIRMEDSiteHeaderTest plan
/materiel/[itemId]→ badge 🛒 affiche 2/panierregroupe par prestataire avec sous-totaux correctsPOST /api/rentals/checkoutnon-authentifié → 401POST /api/rentals/checkoutauthentifié sans Stripe → crée RentalBookings PENDING + bloque dispos/carbets/[slug]affiche bien le panneau « Compléter votre séjour » avec items du même fleuve/reservations/[id]montre la section « Matériel associé » si des RentalBookings sont liées/mes-locationsliste les locations passées et à venir🤖 Generated with Claude Code
Cart lib + cookie persistence (karbe-rental-cart, 30j) avec context React useCart(). Provider wrappé dans layout pour hydratation server→client. Page /panier : - Récap regroupé par prestataire (sous-totaux, caution) - Édition lignes (dates, qté), suppression, vider panier - Bouton « Valider et payer » → POST /api/rentals/checkout - Badge 🛒 dans SiteHeader avec total items Composant <AddToCart /> sur /materiel/[itemId] avec date picker + qté. API POST /api/rentals/checkout : - Validation auth + items actifs + provider approved + qté/dates - Transaction Prisma : recheck stock par fenêtre + crée 1 RentalBooking par prestataire + RentalLines (snapshot prix) + RentalItemAvailability (blocage des dispos) - Calcul commissionAmount selon provider.commissionPct - Si Stripe activé : Checkout Session unique avec 1 line_item par RentalBooking, metadata {type:"rental-bundle", rentalBookingIds:[]} - Sinon : crée en PENDING, retourne rentalBookingIds - Vide le cookie panier après création - Audit log rental.checkout.created Webhook Stripe étendu : - checkout.session.completed type=rental-bundle → CONFIRMED+SUCCEEDED sur toutes les RentalBookings du bundle - payment_intent.payment_failed metadata.rentalBookingIds → CANCELLED + supprime les RentalItemAvailability (libère le stock) Intégration carbet : - /carbets/[slug] : panneau « Compléter votre séjour » avec items des prestataires de la même rivière + System D (recommandation contextuelle) - /reservations/[id] : section « Matériel associé » listant les RentalBookings liées - /mes-locations : page récap toutes les locations (System D + tiers, liées carbet ou standalone) - Lien « Mes locations » dans SiteHeader Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>