Commit graph

151 commits

Author SHA1 Message Date
Ubuntu
15f41a7e2a fix(rental): no setState in effect for cart hydration
All checks were successful
CI / test (pull_request) Successful in 2m21s
ESLint react-hooks/set-state-in-effect bloque le CI. On déplace la
re-hydratation depuis le cookie dans le lazy initializer de useState
(qui ne court qu'une fois côté client). Conserve la cohérence si un
autre onglet a modifié le panier entre le render serveur et l'hydration,
sans déclencher de re-render en cascade.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 08:54:39 +00:00
740e9958aa feat(rental): Sprint E — emails + plugin toggle + tests
Some checks failed
CI / test (push) Failing after 1m10s
2026-06-02 08:50:15 +00:00
Ubuntu
5607a51980 feat(rental): Sprint E — emails + plugin toggle + tests
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>
2026-06-02 08:49:39 +00:00
0723e50189 feat(rental): Sprint D — panier + checkout + carbet integration
Some checks failed
CI / test (push) Failing after 1m9s
2026-06-02 08:44:26 +00:00
Ubuntu
91b4d918ea feat(rental): Sprint D — panier + checkout + intégration carbet
Some checks failed
CI / test (pull_request) Failing after 1m8s
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>
2026-06-02 08:41:53 +00:00
1165f32a63 Merge pull request 'feat(rental): Sprint C — espace prestataire' (#76) from feat/rental-sprint-c into main
All checks were successful
CI / test (push) Successful in 2m18s
2026-06-02 08:01:44 +00:00
Claude Integration
59786e5365 feat(rental): Sprint C — espace prestataire (signup+dashboard+items+calendrier+résa)
All checks were successful
CI / test (pull_request) Successful in 2m33s
2026-06-02 08:01:42 +00:00
8d7e9cfdc2 Merge pull request 'feat(rental): Sprint B — catalogue public' (#75) from feat/rental-sprint-b into main
All checks were successful
CI / test (push) Successful in 2m14s
2026-06-02 07:49:46 +00:00
Claude Integration
f31fb8a32c feat(rental): Sprint B — catalogue public /materiel + détail item + dispo + nav
All checks were successful
CI / test (pull_request) Successful in 2m28s
2026-06-02 07:49:43 +00:00
1dd2d65626 Merge pull request 'fix(rental): client/server import boundary' (#74) from fix/rental-client-server-boundary into main
All checks were successful
CI / test (push) Successful in 2m11s
2026-06-02 03:31:26 +00:00
Claude Integration
90cc7a94af fix(rental): extract category labels en fichier neutre (importable client)
All checks were successful
CI / test (pull_request) Successful in 2m9s
2026-06-02 03:31:22 +00:00
46d3c2d3ab Merge pull request 'feat(rental): Sprint A — modèle + admin + seed' (#73) from feat/rental-sprint-a into main
Some checks failed
CI / test (push) Failing after 1m49s
2026-06-02 03:26:07 +00:00
Claude Integration
e2f3f070fa feat(rental): Sprint A — modèle Prisma + admin CRUD + seed 13 items
Some checks failed
CI / test (pull_request) Failing after 1m52s
2026-06-02 03:26:04 +00:00
d2dcc698e9 Merge pull request 'feat(forms): critères opérationnels dans les formulaires' (#72) from feat/operational-criteria-forms into main
All checks were successful
CI / test (push) Successful in 2m5s
2026-06-02 02:46:36 +00:00
Claude Integration
4901bb950e feat(forms): 4 critères opérationnels dans formulaires admin + espace hôte
All checks were successful
CI / test (pull_request) Successful in 2m16s
2026-06-02 02:46:34 +00:00
1f8250ad7e Merge pull request 'feat: critères opérationnels Guyane' (#71) from feat/operational-criteria into main
All checks were successful
CI / test (push) Successful in 2m5s
2026-06-02 02:26:04 +00:00
Claude Integration
dc2b07507f feat: 4 critères opérationnels (route/capacité/électricité/GSM) + presets profils + badges
All checks were successful
CI / test (pull_request) Successful in 2m23s
2026-06-02 02:26:02 +00:00
153d0671c0 Merge pull request 'feat(reels): swipe horizontal animé' (#70) from feat/reels-swipe-animation into main
All checks were successful
CI / test (push) Successful in 2m4s
2026-06-02 02:03:25 +00:00
Claude Integration
d5732917e3 feat(reels): swipe horizontal animé avec suivi du doigt + snap
All checks were successful
CI / test (pull_request) Successful in 2m16s
2026-06-02 02:03:23 +00:00
5449ec9047 Merge pull request 'feat: PWA installable' (#69) from feat/pwa into main
All checks were successful
CI / test (push) Successful in 2m3s
2026-06-02 01:53:24 +00:00
Claude Integration
bc158ca144 feat(pwa): manifest + icônes 192/512/maskable + Apple touch + viewport theme-color
All checks were successful
CI / test (pull_request) Successful in 2m15s
2026-06-02 01:53:22 +00:00
b8b421e839 Merge pull request 'feat(cron): regenerate-variants' (#68) from feat/cron-regenerate-variants into main
All checks were successful
CI / test (push) Successful in 2m11s
2026-06-02 01:27:22 +00:00
Claude Integration
4fb7c948ad feat(cron): regenerate-variants task pour batch tous les Media existants
All checks were successful
CI / test (pull_request) Successful in 2m24s
2026-06-02 01:27:20 +00:00
3a7c325373 Merge pull request 'feat: variantes responsives image' (#67) from feat/responsive-variants into main
All checks were successful
CI / test (push) Successful in 2m9s
2026-06-02 01:05:27 +00:00
Claude Integration
e2d3b6a686 feat: variantes responsives 320/800/1600 via sharp + srcset partout (Reels, cards, galerie, favoris)
All checks were successful
CI / test (pull_request) Successful in 2m21s
2026-06-02 01:05:25 +00:00
e542a853fa Merge pull request 'feat: Reels plein écran + admin uploader' (#66) from feat/reels-mobile-polish-and-admin-uploader into main
All checks were successful
CI / test (push) Successful in 1m57s
2026-06-02 00:52:59 +00:00
Claude Integration
701a1f02bd feat: Reels plein écran mobile + MediaUploader dans l'admin
All checks were successful
CI / test (pull_request) Successful in 2m19s
2026-06-02 00:52:57 +00:00
403e21fe0a Merge pull request 'feat: Au fil de l'eau (Reels) + uploader pro + favoris' (#65) from feat/au-fil-de-leau into main
All checks were successful
CI / test (push) Successful in 2m7s
2026-06-02 00:27:18 +00:00
Claude Integration
2545a5e1a8 feat: « Au fil de l'eau » — Reels mobile + uploader pro + favoris
All checks were successful
CI / test (pull_request) Successful in 2m18s
2026-06-02 00:27:16 +00:00
a575d40163 Merge pull request 'feat: BookingForm → Stripe Checkout' (#64) from feat/wire-stripe-checkout into main
All checks were successful
CI / test (push) Successful in 1m57s
2026-06-01 23:35:33 +00:00
Claude Integration
2914e5605a feat: BookingForm bascule sur Stripe Checkout quand STRIPE_SECRET_KEY est posée
All checks were successful
CI / test (pull_request) Successful in 2m10s
2026-06-01 23:35:30 +00:00
8285909178 Merge pull request 'feat: carte catalogue + À propos' (#63) from feat/catalog-map-and-about into main
All checks were successful
CI / test (push) Successful in 1m59s
2026-06-01 23:27:59 +00:00
Claude Integration
71dd8c1dad feat: carte interactive du catalogue + refonte page À propos (2.2-2.6k caractères)
All checks were successful
CI / test (pull_request) Successful in 2m21s
2026-06-01 23:27:57 +00:00
444fd1e6fd Merge pull request 'fix(backup): mc image entrypoint' (#62) from fix/backup-mc-entrypoint into main
All checks were successful
CI / test (push) Successful in 1m56s
2026-06-01 20:21:42 +00:00
Claude Integration
92deffa109 fix(backup): minio/mc a entrypoint=mc, ajouter --entrypoint /bin/sh pour wrapper
All checks were successful
CI / test (pull_request) Successful in 1m58s
2026-06-01 20:21:40 +00:00
cf9ee2bd1e Merge pull request 'feat(hardening): rate limit + cron + backup' (#61) from feat/production-hardening into main
All checks were successful
CI / test (push) Successful in 2m7s
2026-06-01 20:16:59 +00:00
Claude Integration
a373bd60ad feat(hardening): rate limit (signup/reset/bookings) + tâches cron + backup PostgreSQL nocturne
All checks were successful
CI / test (pull_request) Successful in 2m10s
2026-06-01 20:16:57 +00:00
f1fb06b0af Merge pull request 'fix: rebrancher /espace-hote sur le dashboard' (#60) from fix/host-dashboard-page into main
All checks were successful
CI / test (push) Successful in 2m7s
2026-06-01 16:20:08 +00:00
Claude Integration
55c0244336 fix: rebrancher espace-hote/page.tsx sur le nouveau dashboard (oubli PR#59)
All checks were successful
CI / test (pull_request) Successful in 2m24s
2026-06-01 16:20:06 +00:00
d1a1bb04de Merge pull request 'feat: espace hôte dashboard + lightbox galerie' (#59) from feat/host-dashboard-and-lightbox into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-01 16:16:27 +00:00
Claude Integration
1e6acf29b9 feat: dashboard espace hôte (KPIs + résa pending + carbets + activité) + lightbox galerie
All checks were successful
CI / test (pull_request) Successful in 2m42s
2026-06-01 16:16:25 +00:00
3e109fb7b4 Merge pull request 'fix: facettes search effectives' (#58) from fix/search-facets into main
All checks were successful
CI / test (push) Successful in 2m0s
2026-06-01 10:21:06 +00:00
Claude Integration
a58815ec9c fix: ajout effectif facettes priceMax + amenities dans SearchFilters (oubli PR#57)
All checks were successful
CI / test (pull_request) Successful in 2m10s
2026-06-01 10:21:03 +00:00
61ccb05c75 Merge pull request 'feat: reset password + mon-compte + facettes recherche' (#57) from feat/reset-profile-facets into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-01 10:16:39 +00:00
Claude Integration
a6df96db7e feat: reset password + page mon-compte (RGPD) + facettes recherche (prix max, équipements)
All checks were successful
CI / test (pull_request) Successful in 2m19s
2026-06-01 10:16:37 +00:00
0b5e5408e8 Merge pull request 'feat: calendrier visuel + carte Leaflet' (#56) from feat/visual-calendar-and-map into main
All checks were successful
CI / test (push) Successful in 1m53s
2026-06-01 05:27:35 +00:00
Claude Integration
31aa7a4865 feat: calendrier visuel mensuel + carte Leaflet sur fiche carbet
All checks were successful
CI / test (pull_request) Successful in 2m0s
2026-06-01 05:27:33 +00:00
231416dd08 Merge pull request 'feat: SiteHeader global' (#55) from feat/site-header into main
All checks were successful
CI / test (push) Successful in 1m58s
2026-06-01 04:29:53 +00:00
Claude Integration
3bc52b2b60 feat: global SiteHeader avec user menu (login/inscription, Mes réservations, Espace hôte, Admin)
All checks were successful
CI / test (pull_request) Successful in 2m9s
2026-06-01 04:29:52 +00:00
4e8b88ab34 Merge pull request 'fix(ci): lint errors qui bloquaient le runner' (#54) from fix/ci-lint-errors into main
All checks were successful
CI / test (push) Successful in 1m58s
2026-06-01 04:18:51 +00:00