feat(rental): Sprint E — emails + plugin toggle + tests
Some checks failed
CI / test (pull_request) Failing after 1m10s
Some checks failed
CI / test (pull_request) Failing after 1m10s
3 nouveaux templates email (best-effort, dry-run sans Resend) : - sendRentalRequestedTenant : récap de demande au locataire (par RB) - sendRentalRequestedProvider : nouvelle demande au prestataire - sendRentalConfirmed : confirmation paiement reçu Branchements : - POST /api/rentals/checkout : envoie tenant + provider après création des RentalBooking (PENDING), catch global pour ne pas bloquer - Webhook Stripe rental-bundle : envoie sendRentalConfirmed à chaque locataire après update CONFIRMED+SUCCEEDED Plugin gear-rental : - Ajout au registry (catégorie business) - layout.tsx /materiel + /espace-prestataire avec requirePluginOr404 - requirePluginOr404 dans /panier et /mes-locations - isPluginEnabled guard dans POST /api/rentals/checkout (404 si off) - SiteHeader masque liens Matériel / Mes locations / Espace prestataire + CartBadge si plugin désactivé - CompleteYourStay renvoie null si plugin désactivé Décision admin → activable depuis /admin/plugins comme tous les autres. Tests vitest (tests/lib/rentals.test.ts, 16 tests) : - diffDays (mêmes dates, 1 nuit, 7 jours, négatif) - parseCart (null/garbage/schéma invalide/valide/format date) - serializeCart (updatedAt, roundtrip) - commission formula (0%, 15%, arrondi centime) - availability arithmetic (totalQty libre, soustractions, plancher 0) 53 tests pass total. Build OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0723e50189
commit
5607a51980
13 changed files with 313 additions and 8 deletions
|
|
@ -7,6 +7,7 @@ import Link from "next/link";
|
|||
|
||||
import { auth } from "@/auth";
|
||||
import { UserRole } from "@/generated/prisma/enums";
|
||||
import { isPluginEnabled } from "@/lib/plugins/server";
|
||||
|
||||
import { CartBadge } from "./CartBadge";
|
||||
import { SignOutButton } from "./SignOutButton";
|
||||
|
|
@ -17,6 +18,7 @@ export async function SiteHeader() {
|
|||
const isAdmin = u?.role === UserRole.ADMIN;
|
||||
const isOwner = u?.role === UserRole.OWNER || isAdmin;
|
||||
const isRentalProvider = u?.role === UserRole.RENTAL_PROVIDER || isAdmin;
|
||||
const rentalEnabled = await isPluginEnabled("gear-rental");
|
||||
|
||||
return (
|
||||
<header className="sticky top-0 z-30 border-b border-zinc-200 bg-white/85 backdrop-blur supports-[backdrop-filter]:bg-white/70">
|
||||
|
|
@ -35,13 +37,15 @@ export async function SiteHeader() {
|
|||
<Link href="/carbets" className="hover:text-zinc-900">
|
||||
Catalogue
|
||||
</Link>
|
||||
<Link href="/materiel" className="hover:text-zinc-900">
|
||||
Matériel
|
||||
</Link>
|
||||
{rentalEnabled ? (
|
||||
<Link href="/materiel" className="hover:text-zinc-900">
|
||||
Matériel
|
||||
</Link>
|
||||
) : null}
|
||||
</nav>
|
||||
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<CartBadge />
|
||||
{rentalEnabled ? <CartBadge /> : null}
|
||||
{u ? (
|
||||
<>
|
||||
<Link href="/mes-favoris" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
|
|
@ -50,9 +54,11 @@ export async function SiteHeader() {
|
|||
<Link href="/mes-reservations" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
Mes réservations
|
||||
</Link>
|
||||
<Link href="/mes-locations" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
Mes locations
|
||||
</Link>
|
||||
{rentalEnabled ? (
|
||||
<Link href="/mes-locations" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
Mes locations
|
||||
</Link>
|
||||
) : null}
|
||||
<Link href="/mon-compte" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
Mon compte
|
||||
</Link>
|
||||
|
|
@ -61,7 +67,7 @@ export async function SiteHeader() {
|
|||
Espace hôte
|
||||
</Link>
|
||||
) : null}
|
||||
{isRentalProvider ? (
|
||||
{isRentalProvider && rentalEnabled ? (
|
||||
<Link href="/espace-prestataire" className="hidden text-zinc-700 hover:text-zinc-900 sm:inline">
|
||||
Espace prestataire
|
||||
</Link>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue