Aller au contenu principal

Nouveautés

Ce qui a été livré dans VFact, tel qu'écrit dans le journal des modifications du logiciel.

Version en ligne : 0.1.153 (build 154)8c923ad4bdéployée le 29 septembre 2026

Version 0.1.153 et suivantes (en cours)

Ajouté
  • Pages légales générées depuis les réglages juridiques (Admin > Juridique) : mentions légales, politique de confidentialité par finalité, CGU/CGV de SaaS avec accord de traitement des données (RGPD art. 28) en annexe, page Sous-traitants
  • Acceptation des CGU horodatée à l'inscription et des CGV à la souscription (version, date, adresse IP) ; prix affichés hors taxes, adresse de facturation et numéro de TVA collectés au paiement
  • E-mail de bienvenue avec vérification de l'adresse e-mail (lien signé 7 jours, rappel à J+2), renvoi depuis le profil
  • Profil > Mes données : export et suppression du compte, export complet et demande d'effacement de l'organisation (30 jours de rétractation) pour son propriétaire
  • Pages publiques rendues côté serveur avec titres, descriptions, canonical et Open Graph propres ; accueil servie sur « / » ; tarifs et blog dans le HTML ; pages Sécurité et confiance, Nouveautés (ce journal) et À propos réécrite
  • Abonnements : périodicités bimestrielle (2 mois) et trimestrielle (3 mois), en plus de mensuelle et annuelle
  • Suppression d'une facture brouillon (bouton dans la fiche facture, refusée dès que la facture est émise)
  • API Partner : `PATCH /partner/invoices/:id` (édition tant que brouillon) et `DELETE /partner/invoices/:id` (scope `invoices:write`)
  • API Partner : produits, devis, factures, fournisseurs et clients (création, modification, émission, envoi, PDF, encaissement)
  • Gestion locative : quittances et factures de loyer (modèle PDF dédié, type de document par abonnement, mentions légales adaptées, pack de démonstration SCI)
  • Impersonation client (mode support) avec identification de l'acteur réel dans les traces
  • Choix du destinataire à l'envoi par email (devis, factures, et paramétrable par abonnement)
  • Suppression d'un client depuis sa fiche (avec garde-fou sur les documents liés)
  • Suppression d'un devis quel que soit son statut
  • Prix d'achat fournisseur sur la fiche produit
  • Aide à la saisie : code postal vers villes, SIRET/SIREN vers informations d'entreprise
  • Tiret séparateur optionnel dans la numérotation des documents
  • Sauvegarde off-site chiffrée quotidienne (base + documents), déchiffreur autonome et runbook de restauration complète
  • Pipeline de déploiement staging vers production avec garde-fous (empreinte de version, contrôle anti-régression, sauvegarde et rollback automatiques)
  • Module "Commerciaux" (gestion des représentants commerciaux, affectation aux clients/factures/devis)
  • Module "Abonnements récurrents" (facturation périodique, templates, variables dynamiques)
  • Module "Prélèvements SEPA" (génération XML pain.008, export CSV)
  • Pagination universelle sur toutes les pages listes (25/50/100/Tout)
  • Tri par colonnes cliquable (A-Z / Z-A)
  • Import données legacy GWeb (clients, produits, factures, devis, abonnements)
  • Page "Mot de passe oublié" et flux de réinitialisation
  • Sidebar responsive (menu hamburger mobile)
  • Script de seed pour super admin
Sécurité
  • Chiffrement AES-256 des secrets Stripe au repos
  • Secrets de production sortis du script de déploiement versionné
  • Identifiants de staging exclus du dépôt
  • 2FA : token de challenge signé (remplace userId exposé)
  • Refresh tokens révocables (hash en base, logout réel)
  • ThrottlerGuard global (rate limiting sur toutes les routes)
  • Rate limiting spécifique sur login/register/2FA/change-password
  • Validation Zod sur tous les endpoints (devis, BL, fournisseurs, adresses, contacts, branding, admin)
  • Encryption SMTP passwords at rest (AES-256-CBC)
  • Correction IDOR sur avis clients (token HMAC requis)
  • Scope organisation sur update/delete produits
  • Protection path traversal renforcée (double-encoding, segments ..)
  • Échappement HTML dans les emails
Corrigé
  • Checklist de conformité : réclamait à tort la mention "TVA non applicable, article 293 B" aux organisations exonérées (location meublée art. 261 D) dont la mention figure sur le modèle de document ou les mentions par défaut
  • Templates de facture personnalisés : le numéro de TVA intracommunautaire de l'émetteur n'était pas imprimé (un `headerHtml` perso remplace l'en-tête standard au lieu de le compléter)
  • Devis : le PDF généré à l'envoi affichait "BROUILLON" au lieu du numéro attribué
  • Téléchargement des PDF cassé depuis l'extérieur (devis, factures, bons de livraison, portail client)
  • Factures importées sans PDF stocké : le document est désormais généré à la volée
  • Webhooks Stripe rejetés en production (contrôle CSRF sur le mauvais chemin, puis clé lue depuis la configuration chiffrée en base)
  • SEPA : pointage des prélèvements émis, propagation automatique des règlements et rejets, arrêt des relances pour les clients prélevés, traitement par lot
  • Abonnements : une facture en prélèvement n'est plus marquée payée dès sa génération
  • Emails : nom d'expéditeur et adresse de réponse à la raison sociale du tenant
  • Recherche produits étendue au nom et à la référence fournisseur ; le filtre de la liste est conservé au retour d'une fiche
  • Devis : date de validité convertie correctement à la création
  • Sauvegardes : dossier de documents réellement actif, exclusion des sauvegardes récursives, mode chiffré opérationnel, cron sans mot de passe en dur
  • Formulaires : services externes de recherche d'adresse et d'entreprise débloqués côté serveur web
  • Facturation électronique Seqino : onboarding fonctionnel (configuration appliquée au connecteur, création de client idempotente)
  • Téléchargement de fichier distant : une erreur HTTP n'est plus traitée comme un succès
  • Factures : affichage corrigé (parsing pagination)
  • Devis : `firstViewedAt` ne s'écrase plus à chaque vue
  • Invitation email : erreurs d'envoi loguées proprement
  • Labels abonnements importés (nom client + résumé lignes)
  • StorageService : téléchargement fichiers locaux corrigé
  • PayPal : marqué "Bientôt disponible" (ghost feature)
Amélioré
  • Déploiement : reprise automatique de l'envoi de l'artefact en cas de coupure réseau, migrations désormais appliquées sur l'environnement de test
  • Contrôle préalable de cohérence de la base avant déploiement
  • 28 index de base de données ajoutés
  • N+1 queries corrigées (SalesReps, lignes factures)
  • Validation variables d'environnement au démarrage
  • Logging HTTP structuré (middleware)
  • Console.log remplacés par NestJS Logger
  • Docker-compose : Redis sécurisé, variables SMTP/Storage ajoutées
  • CI : Redis ajouté, étape lint ajoutée
  • Compatibilité NestJS : @nestjs/schedule et @nestjs/terminus versions corrigées
  • fix(support): l'ecran d'administration montre qui n'a pas confirme son adresse, et un test fige la regle du paiement
  • fix(support): un client ne pouvait ni confirmer son adresse ni payer — garde retiree sur le paiement, deux actions d'administration ajoutees
  • fix(auth): l'impersonation etait cassee — le cookie de l'admin ecrasait le jeton du client impersonifie
  • fix(comptabilite): borne de fin d'un export enregistree deux heures trop tot
  • feat(comptabilite): tracer les exports comptables et avertir sur un mois deja remis — sans jamais refuser
  • docs(caisse): les deux points ouverts de M-14 tranches par Ed
  • fix(caisse): variable de confirmation devenue inutilisee — la porte next lint refusait la livraison
  • fix(metier-m14): un mouvement de caisse ne disparait plus sans trace — annulation avec motif, auteur, audit
  • fix(metier-m4): le corps de la route d'ajustement de stock acceptait encore les entiers seulement
  • fix(metier-m4): stock au millieme, echec de mouvement remonte, historique preserve — le seul defaut CRITIQUE ouvert est ferme
  • docs(securite): bcrypt 6 livre en prod (Build 144), preuves staging et production
  • feat(securite): bcrypt 5.1.1 -> 6.0.0 — le dernier avis critique de la prod disparait, avec deux garde-fous pour prouver que les empreintes restent lisibles
  • docs(securite-s28): lot admin/fournisseurs livre en prod (Build 142), bcrypt 6 prepare et prouve mais non livre
  • feat(securite-s28): valider les corps d'administration et de factures fournisseurs — cliquet 46 -> 30, le mode de reglement ne retombe plus en silence sur le virement
  • docs(securite-s28): lot partenaire livre en prod (Build 141), preuves et trois lecons
  • fix(securite-s28): corriger une affirmation fausse du lot partenaire — la cle de l'IBAN est deja verifiee par le service, recette 27/27 verte
  • feat(securite-s28): valider les corps de l'API Partenaire — clients, adresses, contacts, fournisseurs, lignes d'abonnement, cloture de caisse, emission ; cliquet 58 -> 46
  • docs(securite-s24): nonces CSP tentes, prouves impraticables avec le prerendu statique, annules — compte rendu, les trois voies possibles et la recommandation
  • Revert "feat(securite-s24): nonces dans la politique de sécurité du contenu — middleware Next qui génère un jeton par réponse, nonce sur les six balises de données structurées, map nginx qui laisse passer la politique des pages et garde la sienne ailleurs ; 'unsafe-inline' disparaît de script-src"
  • feat(securite-s24): nonces dans la politique de sécurité du contenu — middleware Next qui génère un jeton par réponse, nonce sur les six balises de données structurées, map nginx qui laisse passer la politique des pages et garde la sienne ailleurs ; 'unsafe-inline' disparaît de script-src
  • docs(securite-s24): resultats staging et prod des cookies HttpOnly (Build 137, tag prod-20260927-securite-cookies), lecons sur le corps optionnel et SameSite
  • feat(securite-s24): jetons de session en cookies HttpOnly (SameSite=Lax pour ne pas casser le retour de paiement, rafraîchissement limité à son chemin) — le navigateur ne stocke plus les jetons, l'en-tête Authorization reste accepté pour les sessions en cours et l'onglet d'impersonation
  • docs(exploitation): resultats en production du lot de surveillance (Build 136, tag prod-20260927-surveillance-erreurs), chaine verifiee en prod, lecon sur l'ordre commit/bump/staging/prod
  • docs(exploitation): resultats staging du lot de surveillance (12/12), les deux defauts trouves par la recette
  • fix(exploitation): l'alerte « parcours critique » part par la file persistante jobs (rejouée 5 fois, traitée en 30 s) au lieu d'un envoi SMTP direct qui se perdait
  • docs(exploitation): recette du lot de surveillance — 403 reproductible par l'adresse non vérifiée, et le piège du 401 qui répond avant
  • fix(exploitation): les chemins des parcours critiques désignaient des routes inexistantes (`/subscriptions/checkout` au lieu de `orgs/:orgId/subscription/checkout`) — corrigés, et un test relit les contrôleurs pour refuser tout chemin orphelin ; imports au lieu de require dans la spec
  • feat(exploitation): surveillance des erreurs HTTP — compteurs par chemin normalisé persistés toutes les 5 min, alerte immédiate sur 403 ou erreur serveur d'un parcours critique (lien d'e-mail, paiement, signature), anomalie 5xx et ligne d'état dans le courrier de 08:00
  • docs(audit): tableau des notes remis a l'etat du 27/09 apres la vague securite (securite 8 -> 9, qualite 7 -> 7,5) et ce qui empeche le 10
  • docs(securite-s5ter): résultats staging et prod (Build 131, tag prod-20260927-securite-s5ter) — joker à trois niveaux prouvé, aller-retour d'envoi de fichier, premier essai de bascule expliqué ; todo et « reste à durcir » : toute la vague sécurité est en prod, avis 31 -> 4
  • docs(securite-s5ter): la nouvelle porte du pilote HTTP dans la liste des fichiers du rapport
  • fix(securite-s5ter): arbre npm cohérent pour Nest 11 (pilote HTTP résolvable) et la préparation d'une release le vérifie avant toute coupure — le premier essai de bascule staging avait échoué sur « No driver (HTTP) has been selected », avec retour arrière automatique
  • feat(securite-s5ter): NestJS 11.2.6 + Express 5 (multer 2.4, body-parser 2, path-to-regexp 8, qs 6.16) — jokers de route réécrits en {*path} avec un garde-fou qui balaye les sources, durées de jeton typées par jwtExpiry, PartialType depuis swagger, rxjs dédoublé ; avis de production 19 -> 4, plus aucun exploitable à l'exécution ; Nest 12 écarté car ESM seul (rapport §1)
  • docs(securite-s5bis): résultats staging et prod (Build 128, tag prod-20260927-securite-s5bis) — pagination du blog prouvée, navigateur sans erreur, fausse alerte 400 expliquée ; todo et « reste à durcir » à jour
  • feat(securite-s5bis): Next.js 15.5.26 + React 19.3.0 (23 avis Next fermés, dont deux exécutions de code à distance) — params et searchParams attendus sur les trois pages serveur du blog, useRef avec valeur initiale, lucide-react 0.577 pour supprimer la deuxième copie de React qui cassait le prérendu, docs à jour
  • docs(fix-csrf): résultats du correctif en staging et prod (Build 127, tag prod-20260927-fix-verification-csrf), recette qui prouve le défaut avant le correctif, todo
  • fix(auth): le lien de vérification d'adresse répondait 403 « CSRF token invalide » — exemption CSRF des dix routes publiques modifiantes (verify-email, confirm-email-change, désinscription en un clic, signature de devis, avis, contact, setup, 2fa-setup, impersonate/exchange) et spec qui balaye les contrôleurs pour empêcher la récidive ; seuil du test d'oracle temporel élargi (instable sous charge)
  • docs(securite-s5): envoi SMTP réel prouvé en prod avec nodemailer 10 (VERIFY_OK puis 250 OK, seul destinataire l'adresse d'Ed), leçon sur le mot de passe SMTP chiffré au repos
  • docs(securite-s5): résultats staging (Build 126, 21/21 + 9 recettes, éditeur vérifié au navigateur) et prod (Build 126, tag prod-20260927-securite-s5), envoi SMTP réel restant à constater, todo et « reste à durcir » à jour
  • fix(securite-s5): les deux éditeurs n'enregistrent plus Link et Underline en double (StarterKit les inclut depuis Tiptap 3.18) — le Link configuré avec rel="noopener noreferrer" et sans ouverture au clic est désormais celui retenu ; résultats de recette du Build 125 et leçon
  • feat(securite-s5): dépendances (S-2) sans montée majeure — nodemailer 10, qs 6.16 posé comme analyseur de requête d'Express (bornes profondeur/tableau/paramètres, spec), multer direct 2.4, npm audit fix (Tiptap 3.31, react 18.3.1 + react-dom aligné, nanoid, minimatch, brace-expansion, path-to-regexp, postcss web), bloc overrides racine retiré (ignoré par npm dans les workspaces) ; audit prod 31 → 19 avis ; rapport avec coûts Next 15 / Nest 12 pour décision
  • docs(securite-s4): todo et « reste à durcir » à l'état Build 124
  • docs(securite-s4): résultats staging (40/43, 3 artefacts) et prod (Build 124, tag prod-20260926-securite-s4), écart recherche partenaire, todo, reste à durcir, leçons
  • feat(securite-s4): périmètre applicatif — gardes de modules (stock, mandats, API partenaire), clés API à scopes fermés / IP validées / expiration / rotation, suspension d'organisation, 12 corps validés (cliquet 74 → 62), liens PDF publics horodatés et révocables (HKDF), e-mails (expéditeur, List-Unsubscribe, désinscription en POST, journaux masqués), doc ASVS réécrite
  • docs(securite-s3): résultats staging et prod (Build 123), point de décision sur les comptes non vérifiés, todo, leçons
  • fix(securite-s3): le filtre d'exceptions garde les champs structurés d'une HttpException (code, resendPath, setupToken) — perdus jusqu'ici, constaté en recette
  • feat(securite-s3): authentification — inscription neutre, vérification d'e-mail bloquante (invitations, 2e société, options), changement d'e-mail en deux temps, réglages requireEmailVerification / require2faForRoles implémentés, avis de sécurité avec IP et navigateur, inactivité bornée 5-720 min, gardes super-admin verrouillées
  • docs(todo): sécurité S2 livrée en prod (Build 121)
  • docs(securite-s2): résultats staging et prod (Build 121), todo, leçons
  • fix(securite-s2): erreurs du body-parser rendues avec leur statut (413 corps trop volumineux, 400 JSON illisible) au lieu d'un 500 — constaté sur la limite de 1 Mo des webhooks
  • chore(livraison): keepalives SSH (ServerAliveInterval 10 s) sur les scripts de livraison — deux coupures « connection reset » pendant npm ci sur le staging le 26/09
  • feat(securite-s2): surface HTTP — limiteur par e-mail, en-têtes nginx (sans unsafe-eval ni X-XSS-Protection, COOP), anti-rejeu Seqino, expiration du state bancaire, uploads sur type réel, psql filtré, front durci
  • docs(securite-s1): résultats staging et prod (Build 118), purge jouée, todo
  • feat(securite-s1): données bancaires chiffrées au repos — mandats sans colonne en clair, clients / comptes / créancier / session bancaire chiffrés, validation IBAN ISO 13616, déchiffrement strict
  • docs(audit): liste consolidee de ce qui reste a durcir par aspect, etat au 26/09 (Build 117)
  • docs(robustesse-4): nettoyage des layouts historiques prod et staging fait sur GO d'Ed (archives datées dans shared/backups)
  • docs(robustesse-5): todo — lot 5 livré en prod (Build 117)
  • feat(robustesse-5): exploitation — cron bloqué en anomalie, courrier de 08h00 enrichi, staging aligné (Restart=always, RATE_LIMIT_MAX), sauvegarde tar -h
  • docs(robustesse-4): rapport complété (staging, rollback, prod Build 116), todo et leçons
  • fix(robustesse-4): releases en echec exclues du retour arriere ; rapport du lot 4
  • fix(robustesse-4): release.sh — npm ci avec --include-workspace-root (papaparse, pdf-parse a la racine) et chargement a blanc de app.module.js avant bascule
  • fix(robustesse-4): release.sh — live_dir vide quand current n'existe pas encore (premier passage staging)
  • feat(robustesse-4): déploiement atomique par dossier de release — release.sh commun prod/staging, bascule du lien current, node_modules par npm ci
  • docs(robustesse-3): résultats de recette staging Build 112, todo et leçons
  • feat(robustesse-3): file de tâches persistante en base (table jobs, cron jobs) — e-mails, imports CSV, sauvegardes d'organisation, exports FEC hors requête
  • docs(robustesse-2): résultats de recette staging Build 111, todo et leçon
  • feat(robustesse-2): émission sans transaction longue — PDF rendu hors transaction, cron pdf-reparation, lecteurs 409
  • feat(robustesse-1): restauration a un instant donne — archivage WAL continu, sauvegarde de base, expedition Gaia, exercice de restauration
  • feat(accueil): vraie capture du tableau de bord a la place de l'encart « capture d'ecran »
  • feat(exploitation): courrier quotidien toujours envoye — « tout est en ordre » ou anomalies
  • fix(audit-v4): correctifs de la vague 1 verifies — refresh multi-onglets, passphrase, file de connexion, Starter, categorie d'operation, devise recue, PA_ONLY, audit admin global, portes
  • feat(tarifs): Essentiel a 30 factures/mois, Starter impose VFact Pay pour les reglements clients
  • feat(archive): horodatage — information au lieu d'alerte, autorite RFC 3161 configurable dans le super-admin
  • feat(exploitation): ligne d'etat de la sauvegarde nocturne dans le courrier d'exploitation
  • docs(audit-v3): vague 1 livree en prod (Build 103) — etat de livraison, notes apres vague, todo, lecons
  • fix(exploitation): durcissement systemd en drop-in, senderName derive du fournisseur
  • fix(nginx): pas de doublon gzip on avec nginx.conf (nginx -t refusait le vhost)
  • feat(audit-v3): lots V3-0 a V3-9 et E2 — urgences, comptabilite, automatismes, juridique, securite, performance, conformite 2026, qualite, ergonomie
  • docs(audit-v3): sept rapports d'audit, rapport consolide et plan V3-0 a V3-12 ; lecons et todo
  • fix(exploitation): statut break-glass lu par l'API et echec de sauvegarde non avale
  • docs(audit-v2): lots C, G et E1 livres en prod (Build 99) ; staging : pas de relance apres estampillage
  • fix(factures): refuser un avoir sans mode ou a 0 EUR ; staging : relancer l'API apres l'estampillage
  • feat(produit): lots C, G et E1 de l'audit v2 — essai 14 jours et verite marketing, exactitude metier, ergonomie
  • fix(auth): jti aleatoire par jeton ; staging : cles Stripe test dans payment_settings, LOG_DIR sous vfadmin
  • fix(securite): lot A de l'audit v2 — sessions revocables, restauration en liste blanche, XSS, Stripe livemode, roles SEPA, alertes
  • docs(audit): audit complet v2 du 2026-09-24 — ergonomie, fonctionnel/reforme 2026, securite, robustesse, metier (rapport + 5 passes)
  • docs(audit): lots 4 et 5 livres en prod (Build 95), lecon sur les node_modules des serveurs
  • fix(web): lot 4 de l'audit global (2/2) — traductions avec repli, menu Banque ; lot 5 : dependances mortes
  • chore(qualite): lot 5 de l'audit global — tests dans la livraison, env valide, code mort, hygiene du depot
  • fix(web): lot 4 de l'audit global (1/2) — deconnexion, societe courante, erreurs visibles, mobile
  • fix(logrotate): bloc separe avec su root syslog pour /var/log/ezfact-backup.log
  • fix(nginx): server_tokens deja pose dans nginx.conf, ne pas le dupliquer dans le vhost