Changelog — Fleeticia
Toutes les évolutions notables sont documentées ici.
Le format suit Keep a Changelog et le versionning Semantic Versioning.
Statut produit : pré-lancement public. La 2.0.0 marquera l'ouverture aux Founding Members.[1.15.1] — 2026-05-31 — Enrichissement sémantique des pages SEO
📝 Contenu SEO
- Pages mots-clés enrichies :
/logiciel-gestion-flotteet/logiciel-location-vehiculesréécrites en version beaucoup plus complète pour couvrir le champ lexical attendu par Google (score sémantique) - Gestion de flotte : ajout des sections « Qu'est-ce qu'un logiciel de gestion de flotte », « Maîtrisez le TCO », « Géolocalisation & télématique », « Pour quelles flottes ». Vocabulaire métier intégré naturellement : parc automobile, gestionnaire de parc, conducteurs, carburant/consommation, télématique, TCO, utilitaires/engins, kilométrage, fleet management
- Location de véhicules : ajout des sections « Solution pensée pour les loueurs », « Location courte & longue durée (LLD) », « Pour quels loueurs ». Vocabulaire : agences de location, LLD, contrat de location, état des lieux, loueur indépendant, multi-agences
- FAQ étoffées (6 questions par page) +
keywordsciblés dans les métadonnées
📰 Blog orienté gestion de flotte (6 articles)
- Recentrage éditorial sur la gestion de flotte (cœur du produit FLEET) : retrait de l'article Peppol
- « Excel ou logiciel de gestion de flotte : à partir de quand changer ? »
- « Électrifier sa flotte en Belgique : ce qu'il faut anticiper »
- « Réduire le coût total de possession (TCO) de votre flotte : 6 leviers concrets »
- « Carnet d'entretien numérique : ne ratez plus un contrôle technique ni une révision »
- « Géolocalisation de flotte en Belgique : bénéfices et conformité RGPD »
- « Voiture de société : ATN & carnet kilométrique »
- Contenu humanisé (passage au humanizer) : zéro em-dash, rythme varié, voix de praticien, champ lexical SEO préservé
[1.15.0] — 2026-05-31 — Fondation SEO & référencement Google
🔍 SEO
- Domaine canonique :
fleeticia.comredirige désormais en 301 versfleeticia.be(+www→ apex) pour éviter le contenu dupliqué et concentrer le référencement - `robots.txt` généré (
/robots.txt) : autorise les pages marketing, bloque toute l'app derrière auth (/dashboard,/settings,/fleet…) et les/api - `sitemap.xml` généré (
/sitemap.xml) : liste les pages publiques indexables avec priorités - Métadonnées enrichies :
metadataBase, titre/description ciblés (gestion de flotte + location, Belgique), mots-clés, URL canonique,lang=fr, localefr_BE - Open Graph + Twitter Card : carte sociale 1200×630 générée dynamiquement (
/opengraph-image) pour de beaux partages LinkedIn/X/Facebook - Données structurées JSON-LD :
Organization+WebSite+SoftwareApplication(Schema.org) → éligibilité rich results / knowledge panel - Vérification Google Search Console : support via env
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION - Fix :
/changelogétait bloqué par le middleware (redirigé vers login) → désormais public et indexable
📝 Contenu SEO
- Pages d'atterrissage ciblées mots-clés :
/logiciel-gestion-flotteet/logiciel-location-vehicules(server components statiques, métadonnées propres, FAQ + JSON-LDFAQPagepour les rich results) - Blog : index
/blog+ articles SSG/blog/[slug]avec JSON-LDArticle, 2 articles topicaux belges (Peppol 2026, voiture de société / ATN) - Maillage interne : liens depuis le footer de la landing vers les pages SEO + shell marketing réutilisable (
MarketingShell) - Toutes les nouvelles pages publiques ajoutées au sitemap et aux chemins publics du middleware
[1.14.1] — 2026-05-31 — Fix chevauchement calendrier réservations
🐛 Fix
- Calendrier réservations : les blocs se superposaient visuellement quand plusieurs réservations/contrats se chevauchaient sur le même véhicule. Algorithme de lane assignment ajouté (tri par date de début, assignation à la première lane disponible). La hauteur de la ligne s'adapte dynamiquement au nombre de lanes (min 46px, +22px par lane supplémentaire). Fonctionne aussi sur la ligne "Non assignées".
[1.14.0] — 2026-05-29 — Pièces jointes maintenance & documents véhicules
✨ Features — Maintenance
- Upload de pièces jointes : chaque enregistrement de maintenance peut contenir jusqu'à 5 documents (PDF, images JPG/PNG/WebP, max 10MB)
- Service de stockage :
/lib/maintenance/doc-storage.tsbasé sur Supabase Storage avec bucketmaintenance-docs, URLs signées 7 jours - API routes documents :
POST /api/maintenance/[id]/documents(upload),GET(liste avec URLs fraîches),DELETE /api/maintenance/[id]/documents/[docId](suppression Owner uniquement) - UI enrichie MaintenanceDrawer : section documents par enregistrement avec compteur "📎 X pièce(s) jointe(s)", bouton upload "+", liste expandable avec liens "Voir" (nouvel onglet) et suppression "🗑️"
- Gestion complète lifecycle : upload multipart/form-data, validation taille/type MIME, path structure
{tenantId}/{vehicleId}/{recordId}/{docId}-{filename}, suppression cascade, refresh URLs automatique
🔧 Database
- Schema Prisma étendu : champ
documents Json @default("[]")surMaintenanceRecord - Migration SQL :
20260529_add_documents_to_maintenance_recordavecALTER TABLEJSONB
[1.13.1] — 2026-05-29 — Code cleanup & sécurité
🧹 Cleanup
- Suppression fichiers temporaires :
fix-commit2.js,fix-rebase.js,CHANGELOG_DEV.md,route.ts.backup - Logs de debug supprimés :
console.logretirés dans billing page, yousign webhook, create-checkout (dont un log qui exposait les valeurs de signature HMAC brutes) - TypeScript :
billingDetails: any→BillingDetailstypé dans pdf-generator ;transformdansuseDataFetchingtypé via générique<T>;pickListpasse deanyàRecord<string, unknown>
[1.13.0] — 2026-05-29 — Facturation in-app, Super Admin avancé & dropdown fix
PR #45
✨ Features — Facturation & Abonnements
- Historique des factures : section dédiée dans
/settings/billingavec numéro, date, montant TTC, statut et téléchargement PDF - Route `GET /api/billing/invoices` : liste paginée des
SubscriptionInvoicedu tenant (Super Admin peut consulter n'importe quel tenant via?tenantId=xxx)
✨ Features — Super Admin
- Dashboard KPIs :
GET /api/admin/stats— 12 indicateurs avancés (MRR, croissance ±30j, conversion rate, nouveaux 7j, fondateurs, churn mensuel) - Page détail tenant :
/admin/tenants/[id]avec 5 sections (vue d'ensemble, abonnement, users, onboarding score, infos techniques) - Impersonation sécurisée : JWT 1h via
POST /api/admin/tenants/[id]/impersonate - Extension trial :
POST /api/admin/tenants/[id]/extend-trial— input jours, updatetrialEndsAt+Subscription.trialEnd - Reset password utilisateur : générateur format sécurisé, hash bcrypt
- Sync Stripe forcé : header
x-super-admin-tenantpour syncer n'importe quel tenant - Badges Founding Member : icône 🏆 + badge "Founding" dans liste et drawer
- Statut Stripe enrichi : badge
Stripe · ACTIVE/TRIAL/CANCELEDdans le drawer - Lignes tableau cliquables vers page détail tenant
- Stats temps réel : shimmer loading states + 8 KPIs sur 2 rows
🐛 Fix
- Dropdown context menu : menu ⋯ dans AdminPage ne se clippait plus dans le tableau (
overflow: hidden). Résolution viaposition: fixed+getBoundingClientRect()— le menu s'affiche maintenant correctement hors des limites du tableau
[1.12.0] — 2026-05-26 — Tests E2E critiques & CI/CD pipeline
🧪 Tests E2E
- signup-trial.spec.ts : 8 tests couvrant le workflow complet signup → trial — landing page, ouverture SignupModal, validation formulaire multi-étapes, redirection dashboard, TrialBanner
- fleet-management.spec.ts : 7 tests gestion de flotte — affichage liste, ajout véhicule (formulaire + modal), filtres par statut, recherche, responsive mobile
- contracts.spec.ts : 8 tests création contrats — wizard multi-étapes, sélection véhicule, saisie client, navigation étapes, liste contrats, bouton PDF
- checkout-billing.spec.ts : 8 tests facturation — page billing Owner, statut abonnement, historique factures, checkout Stripe mock, TrialBanner, sécurité accès (Agent bloqué)
- Tous les tests utilisent
page.route()pour mocker les API — pas de vraie DB requise en CI - Pattern cohérent :
test.skip()gracieux si nécessite auth non disponible
🔧 CI/CD GitHub Actions
- `.github/workflows/ci.yml` : pipeline PR/push sur
dev/main— tests unitaires Vitest, typecheck TypeScript, build production (jobs séquencés) - `.github/workflows/e2e.yml` : Playwright chromium sur chaque PR — build + E2E + artifacts HTML report + screenshots/vidéos en cas d'échec
- Rétention artifacts : 7j rapport, 3j test-results
- Cache pnpm pour les deux workflows
[1.11.0] — 2026-05-25 — Super Admin complet
✨ Features
- Dashboard KPIs : API
GET /api/admin/statsavec 12 indicateurs avancés (MRR, croissance MRR ±30j, conversion rate, nouveaux 7j, fondateurs, churn mensuel) - Page détail tenant : nouvelle route
/admin/tenants/[id]avec 5 sections (vue d'ensemble, abonnement, utilisateurs, onboarding score 0-100%, infos techniques copyables) - Impersonation sécurisée :
POST /api/admin/tenants/[id]/impersonategénère JWT 1h pour premier Owner du tenant avec metadataimpersonatedBy - Extension trial :
POST /api/admin/tenants/[id]/extend-trialavec input jours + bouton "Prolonger", met à jourTenant.trialEndsAtetSubscription.trialEnd - Reset password utilisateur :
POST /api/admin/tenants/[id]/reset-passwordgénère mot de passe temporaire format "QuickLion123", hash bcrypt, option userId - Sync Stripe forcé : extension
/api/billing/sync-subscriptionaccepte headerx-super-admin-tenantpour sync n'importe quel tenant - Navigation améliorée : lignes tableau AdminPage cliquables vers page détail, Topbar avec tabs "Clients" / "Audit Trail"
- Stats temps réel : AdminPage utilise
/api/admin/stats, shimmer loading states, 8 KPIs sur 2 rows
🔧 API
- GET /api/admin/stats : 12 KPIs globaux avec calculs parallèles optimisés
- GET /api/admin/tenants/[id] : enrichi avec users (lastLoginAt, twoFactorEnabled), counts étendus, subscription détaillée
- POST /api/admin/tenants/[id]/extend-trial : validation Zod, extension trial jusqu'au 365j
- POST /api/admin/tenants/[id]/impersonate : JWT 1h avec metadata impersonation
- POST /api/admin/tenants/[id]/reset-password : générateur mots de passe sécurisé
[1.10.0] — 2026-05-25 — Factures SaaS & Super Admin++
✨ Features
- Historique des factures : section dédiée dans
/settings/billingavec numéro, date, montant TTC, statut et téléchargement PDF - Nouvelle route
GET /api/billing/invoices— liste paginée desSubscriptionInvoicedu tenant (Super Admin peut consulter n'importe quel tenant via?tenantId=xxx) - Super Admin — badges Founding Member : icône 🏆 dans la liste des clients + badge "Founding" dans le drawer de détail
- Super Admin — statut Stripe : badge
Stripe · ACTIVE/TRIAL/CANCELEDdans le drawer pour voir l'état réel de l'abonnement - Super Admin — fin d'essai : date de fin du trial dans la section Activité du drawer client
- API admin enrichie :
subscription(status, plan, trialEnd) inclus dans leGET /api/admin/tenants
[1.9.2] — 2026-05-25 — Invoice polish & signature button
🐛 Fixes
- Bouton "Envoyer pour signature électronique" masqué (fonctionnalité non opérationnelle)
- Logo Fleeticia dans les PDF :
logo.png(icon + wordmark) + badge "Généré par" rétabli - Facture : agences vides et "Retour réel" masqués si non renseignés
- Contrat PDF : idem pour les champs agence dans les sections de prise en charge
[1.9.0] — 2026-05-23 — Catalogue contrats configurable
✨ Features
- Catalogue contrats : les assurances et options dans les contrats de location sont maintenant 100% configurables par le tenant (plus de valeurs hardcodées)
- Nouveau modèle Prisma
ContractCatalogItem(type: insurance/option, prix, priceType: PER_DAY/FIXED, actif/inactif) - Page Settings → Catalogue contrats (
/settings/contracts) : CRUD complet avec inline edit, toggle actif/inactif, prix par jour ou forfait - API REST
/api/settings/contract-catalog(GET/POST/PUT/DELETE) avec ownership check - Modal contrat (étape Tarifs) : charge le catalogue du tenant via API, calcul automatique selon
priceType - Option « Aucune assurance » toujours disponible
- Si aucun catalogue configuré → valeurs démo affichées + bannière d'alerte avec lien vers Settings
- Items désactivés ne sont plus proposés dans les nouveaux contrats
- Lien « Catalogue contrats » ajouté dans Settings principal (RENTAL uniquement)
[1.8.2] — 2026-05-23 — Mobile modal fix
📱 Mobile
- Bottom-nav masquait les boutons de modals : les boutons « Suivant » et « Enregistrer » des wizards étaient cachés derrière la barre de navigation mobile
- Fix sur 6 composants : VehicleModal, ContractModal, ReservationModal, ClientModal, ImportModal, TutorialModal
- Méthode :
useEffectajoutebody.fl-modal-openà l'ouverture, retire la classe à la fermeture - CSS :
.fl-modalpasse àz-index: 200sur mobile ;body.fl-modal-open .fl-mobile-nav { display: none }masque la nav pendant la saisie
[1.8.1] — 2026-05-22 — Versioning & process
📦 Versioning
- Règle obligatoire ajoutée dans
.claude/CLAUDE.md: bumperAPP_VERSION
et mettre à jour CHANGELOG.md à chaque PR notable
- Le build hook
sync-changelog.mjsgarantit la cohérence racine ↔ apps/web
[1.8.0] — 2026-05-22 — Production-ready
🏗️ Infrastructure
- Base de données production séparée de la dev (deux projets Supabase distincts)
- Auto-patch
?pgbouncer=true&connection_limit=1danslib/prisma.ts— résilient aux env vars copiées sans le flag depuis Supabase - Env vars Vercel scopées correctement Production / Preview / Development
.env.prodretiré de l'historique git +.gitignorerenforcé- Domaine
fleeticia.beacheté (OVH) — DNS en cours
🍪 RGPD / Cookies
- CookieBanner RGPD-compliant : expiration 13 mois (recommandation CNIL), version pour forcer re-consent si politique change
- Bouton « Gérer mes cookies » dans le footer landing + page
/cookies - API globale
window.fleeticiaOpenCookieSettings()pour intégration future
📦 Versioning
CHANGELOG.mdcomplet depuis la1.0.0- Détection de nouvelle version côté client (toast « Une nouvelle version est disponible ») avec bouton « Voir les changements »
📱 Polish mobile
- Modal footer :
env(safe-area-inset-bottom)pour ne plus cacher les CTAs sous le home indicator iOS / Android - Réservations calendrier : vraie date du jour au lieu du
2026-04-15hardcodé (sauf en mode démo) - Création véhicule :
colorHexpar défaut#888888au lieu d'une CSS var qui plantait Zod
🐛 Fixes
- Réservations créées invisibles (incompatibilité shape
{ data, pagination }vs{ reservations }) getBillingDashboardn'exposait pastenant.stripeCustomerId→ bouton portail Stripe inactif- Trial expiré : la garde lecture seule ne se déclenchait pas si
Subscription.status === "TRIAL"restait en DB - Vercel preview login 500 : pgbouncer + Deployment Protection
- Audit page réécrite (inline styles + Sidebar/Topbar)
[1.7.0] — 2026-05-20 — Founding Members + Read-only mode
PR #39
🏆 Founding Members
- Offre : 20 premières entreprises belges, prix bloqué à vie
Tenant.isFoundingMemberpersisté en DB, posé au signup pour les 20 premiers- Trial étendu à 44 jours (14 + 30 offerts) pour les Founding
- Email de bienvenue brandé avec badge 🏆 + mention Discord privé
- Bannière 🏆 Founding Member sur
/settings/billing
🔒 Mode lecture seule
useReadOnly()hook depuisBillingProvider→ désactive tous les boutons d'action- 7 modules couverts : Fleet, Contracts, Clients, Reservations, Maintenance, Damages, Agencies
- Copilot complet (textarea, send, quick actions, WelcomeScreen cards) désactivé en read-only
TrialBannerglobale (root layout) — visible sur toutes les pages
💳 Stripe Billing
- Bouton portail adaptatif (3 états : ACTIVE → portail, sans Subscription → checkout auto, sans Customer → création + checkout)
- Webhook
account.updated(v1) ETv2.core.account.updated(thin event v2) pour Connect account.updatedcleartenant.trialEndsAtautomatiquement quand la subscription devient ACTIVE- Auto-sync au retour de Stripe Checkout (
?upgraded=1ou?upgraded=synced)
[1.6.0] — 2026-05-18 — Belgium-only + Bug bash
PRs #36, #37, #38
🇧🇪 Belgium-only
- Suppression des sélecteurs multi-devise (EUR/CHF/GBP) — locked EUR
- Suppression des sélecteurs multi-pays côté tenant — locked BE
- Liste internationale conservée pour les clients (touristes, B2B intracom)
- TVA presets BE-only : 6%, 12%, 21%
- Stripe Connect Express toujours créé en
country: "BE" - Stripe Checkout payment methods : toujours
card + bancontact - Copy landing : « BeNeLux » → « Belgique »
🐛 Bug bash critique
- Stripe Connect direct charge : l'argent allait sur le compte Fleeticia au lieu du tenant — fix complet (schema
stripeConnectAccountId, onboarding hosted, page/settings/payments) - Création contrats : 400 systématique (Zod schema désynchronisé du payload réel)
- Bouton « Générer lien de paiement » grisé + tooltip + fallback bouton IBAN par email
- Email de bienvenue : « Aujourd'hui » remplacé par vraie date + URL CTA corrigée
📱 Mobile UX
- Topbar safe-area pour ne pas chevaucher le notch iOS
- Fleet filtres : grille 2×2 + bouton « Ajouter véhicule » pleine largeur
- Fleet cards véhicules : score rings remplacés par pills compacts
- Stats bar Fleet : 6 cards essentielles (3×2) au lieu du scroll horizontal
[1.5.0] — 2026-05-17 — Dual-product + Settings + Help
PRs #23, #25, #26, #27, #28, #30, #31, #32
🎯 Architecture
- Dual-product : tenant peut être
RENTAL(agences) ouFLEET(corporate). Modules conditionnés. - Middleware bloque routes rental-only pour les tenants FLEET
- Sidebar / dashboard / analytics / map / copilot adaptés par produit
✨ Quality of life
- Bulk import véhicules + clients via CSV (preview + validation)
- Centre d'aide complet : 16 tutoriels + 20 FAQs
- Settings : thème (dark/light/system), export complet CSV, reset, push notifications
- Branding : couleurs primary/secondary + angle de dégradé personnalisable
- Logo brandable via SVG mask-image
- Vercel Analytics + Speed Insights intégrés
🐛 Fixes
- Formulaire véhicule adapté au productType (RENTAL vs FLEET)
- Branding cohérent partout (boutons, badges, gradients)
- CSP autorise Vercel Analytics
[1.4.0] — 2026-05-12 — Copilot IA
PR #22
- Module Copilot production-ready
- Streaming des réponses Claude
- Quick actions (Brief du jour, Problèmes urgents, Performance financière, Optimiser l'occupation, Prévisions 7 jours, Santé de la flotte)
- WelcomeScreen avec 6 cartes d'actions rapides
- Prompts adaptés FLEET vs RENTAL
- Persistence des conversations en localStorage
[1.3.0] — 2026-05-11 — Module Clients
PR #21
- Modèle Prisma
Client(firstName, lastName, email unique, phone, address, dateOfBirth, driverLicense, blacklist, RGPD consent) - Page
/clientsavec stats, recherche, filtres, drawer détail - Création / édition / suppression avec anonymisation RGPD des contrats liés
- Intégration
ClientPickerdansContractModal(autocomplete + pré-remplissage) - Blacklist avec raison + traçabilité
[1.2.0] — 2026-05-10 — Analytics, Live Map & Maintenance
PRs #16, #17, #18, #19, #20
📊 Analytics
- Période 3/6/12 mois
- 6 KPIs : CA, croissance, occupation, durée moyenne, CA/contrat, top véhicule
- Charts : revenu mensuel, Year-over-Year, Top clients, revenu par véhicule
- Export CSV avec 3 sections
- Cache serveur 60 min TTL
🗺️ Live Map
- Carte Leaflet avec marqueurs custom colorés par statut
- Mode positionnement crosshair pour mettre à jour les positions
- Auto-refresh 60s
🔧 Maintenance
- Modèle
MaintenanceRecord(type, description, date, km, coût, prochaine date/km) - Statuts auto : urgent, à venir, à jour
- Plan Pro+ requis
🎨 Landing redesign
- Page d'accueil refondue
- Pages légales complètes (Mentions / CGV / Confidentialité / Cookies / Contact)
- Cookie banner RGPD (v1)
[1.1.0] — 2026-05-05 — Sessions + BeNeLux Payment Methods
PRs #12, #13
- Active sessions management : liste + déconnexion à distance
- Audit trail des connexions
- Stripe Checkout : Bancontact (BE) + iDEAL (NL) selon le pays du tenant
[1.0.1] — 2026-05-02 — 2FA Documentation
- Guide utilisateur 2FA
docs/2fa-guide.md(10 sections) - Documentation API
docs/2fa-api.md - FAQ et troubleshooting non-techniques
[1.0.0] — 2026-05-02 — MVP Production
PRs #2 → #11
🚀 Stack & Architecture
- Next.js 16 + Prisma + Supabase + JWT auth maison
- Multi-tenant avec role model (Super Admin / Owner / Agent)
- 2FA TOTP pour Owners et Super Admins
📦 Modules livrés
- Dashboard avec KPIs (CA, occupation, contrats, alertes)
- Fleet : CRUD véhicules, score santé, photos, scoring auto
- Contracts : wizard, signatures, PDF export, contrats imprimables
- Reservations : Gantt + calendrier
- EDL (états des lieux avec zones photo)
- Invoicing : génération PDF avec TVA par pays, mentions BCE, numérotation
FLEET-YYYY-NNNNN - Super Admin panel : gestion des tenants
📱 Mobile
- Tous les modules mobile-first
- Touch targets ≥ 44px
- Wizards multi-étapes sur petit écran
- Tables → cards sur mobile
🔒 Sécurité
- 2FA TOTP (Google Authenticator, Authy)
- Codes de récupération
- Rate limiting auth + API + webhook
- Headers CSP / HSTS / X-Frame-Options durcis
- Audit logs structurés sur 67 routes API
🛡️ Production-readiness
- Notifications push (web push API)
- Cron jobs : rappels d'échéances, expirations CT/assurance
- PWA installable (manifest, service worker, mode offline partiel)
- Module Sinistres : déclaration, photos, statuts assurance
- Export comptable annuel (Odoo, Exact Online, CSV générique)
🇪🇺 BeNeLux
- TVA par pays (BE 21%, NL 21%, LU 17%, FR 20%, DE 19% — verrouillé BE en v1.6)
- Locales fr-BE
- Mode démo (Super Admin) avec dataset BeNeLux fictif
- Multi-agences (Belgique, Pays-Bas, Luxembourg — clients étrangers conservés en v1.6)