Version actuelle : 1.15.1

Changelog

Dernière release : 2026-05-31

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-flotte et /logiciel-location-vehicules réé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) + keywords ciblé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.com redirige désormais en 301 vers fleeticia.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, locale fr_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-flotte et /logiciel-location-vehicules (server components statiques, métadonnées propres, FAQ + JSON-LD FAQPage pour les rich results)
  • Blog : index /blog + articles SSG /blog/[slug] avec JSON-LD Article, 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.ts basé sur Supabase Storage avec bucket maintenance-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("[]") sur MaintenanceRecord
  • Migration SQL : 20260529_add_documents_to_maintenance_record avec ALTER TABLE JSONB

[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.log retirés dans billing page, yousign webhook, create-checkout (dont un log qui exposait les valeurs de signature HMAC brutes)
  • TypeScript : billingDetails: anyBillingDetails typé dans pdf-generator ; transform dans useDataFetching typé via générique <T> ; pickList passe de any à 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/billing avec numéro, date, montant TTC, statut et téléchargement PDF
  • Route `GET /api/billing/invoices` : liste paginée des SubscriptionInvoice du 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, update trialEndsAt + Subscription.trialEnd
  • Reset password utilisateur : générateur format sécurisé, hash bcrypt
  • Sync Stripe forcé : header x-super-admin-tenant pour syncer n'importe quel tenant
  • Badges Founding Member : icône 🏆 + badge "Founding" dans liste et drawer
  • Statut Stripe enrichi : badge Stripe · ACTIVE/TRIAL/CANCELED dans 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 via position: 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/stats avec 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]/impersonate génère JWT 1h pour premier Owner du tenant avec metadata impersonatedBy
  • Extension trial : POST /api/admin/tenants/[id]/extend-trial avec input jours + bouton "Prolonger", met à jour Tenant.trialEndsAt et Subscription.trialEnd
  • Reset password utilisateur : POST /api/admin/tenants/[id]/reset-password génère mot de passe temporaire format "QuickLion123", hash bcrypt, option userId
  • Sync Stripe forcé : extension /api/billing/sync-subscription accepte header x-super-admin-tenant pour 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/billing avec numéro, date, montant TTC, statut et téléchargement PDF
  • Nouvelle route GET /api/billing/invoices — liste paginée des SubscriptionInvoice du 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/CANCELED dans 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 le GET /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 : useEffect ajoute body.fl-modal-open à l'ouverture, retire la classe à la fermeture
  • CSS : .fl-modal passe à z-index: 200 sur 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 : bumper APP_VERSION

et mettre à jour CHANGELOG.md à chaque PR notable

  • Le build hook sync-changelog.mjs garantit 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=1 dans lib/prisma.ts — résilient aux env vars copiées sans le flag depuis Supabase
  • Env vars Vercel scopées correctement Production / Preview / Development
  • .env.prod retiré de l'historique git + .gitignore renforcé
  • Domaine fleeticia.be acheté (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.md complet depuis la 1.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-15 hardcodé (sauf en mode démo)
  • Création véhicule : colorHex par défaut #888888 au lieu d'une CSS var qui plantait Zod

🐛 Fixes

  • Réservations créées invisibles (incompatibilité shape { data, pagination } vs { reservations })
  • getBillingDashboard n'exposait pas tenant.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.isFoundingMember persisté 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 depuis BillingProvider → 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
  • TrialBanner globale (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) ET v2.core.account.updated (thin event v2) pour Connect
  • account.updated clear tenant.trialEndsAt automatiquement quand la subscription devient ACTIVE
  • Auto-sync au retour de Stripe Checkout (?upgraded=1 ou ?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) ou FLEET (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 /clients avec stats, recherche, filtres, drawer détail
  • Création / édition / suppression avec anonymisation RGPD des contrats liés
  • Intégration ClientPicker dans ContractModal (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)