Aller au contenu principal

Conformité fiscale — Z-Reports, FEC, archivage et contrôle DGFiP

Ce guide explique comment utiliser FixVault pour rester conforme aux obligations fiscales françaises (NF525, CGI Article 286-I-3bis, FEC LPF A47 A-1, conservation CGI L102 B). Il s'adresse à l'utilisateur final.


1. Z-Report quotidien (clôture journalière)

Le Z-Report est la clôture fiscale obligatoire de chaque journée d'exploitation. Il fige les ventes du jour, ventile par TVA et par moyen de paiement, et calcule le Grand Total perpétuel cumulé depuis le premier jour de conformité.

Comment générer un Z-Report

Méthode normale (recommandée) : passer par la fermeture de caisse.

  1. Aller dans Rapports → Sessions de caisse.
  2. Sur la session ouverte, cliquer sur Fermer la session.
  3. Saisir le fond de caisse compté physiquement.
  4. Cliquer sur Confirmer la clôture.

→ FixVault génère automatiquement le Z-Report du jour à ce moment-là.

Méthode manuelle (admin uniquement, en cas d'oubli) :

  1. Aller dans Comptabilité.
  2. Cliquer sur la card Rapports Z.
  3. Cliquer sur Générer le rapport Z pour la date manquante.

Important : un Z-Report d'une journée passée ne peut jamais être modifié (NF525 — registre append-only). Si vous oubliez de clôturer, le Z peut encore être généré le lendemain mais portera la date d'origine.

Comment consulter / imprimer

  • Liste : Comptabilité → Rapports Z (table paginée, du plus récent au plus ancien).
  • Détail : cliquer sur un Z-Report dans la liste.
  • PDF : bouton Télécharger PDF sur le détail du Z (à conserver).

2. Vérifier l'inaltérabilité de la chaîne fiscale

FixVault chaîne toutes les écritures fiscales avec un hash SHA-256 (NF525). Si un seul caractère est modifié dans la base, la chaîne se casse et le contrôle d'intégrité l'affiche immédiatement.

Vérification depuis l'interface

  1. Aller dans Comptabilité.
  2. Regarder la carte Chaîne fiscale en haut de page :
    • Intègre (vert) → tout va bien.
    • Rompue (rouge) → contacter immédiatement le support technique.

Vérification technique (admin)

GET /api/fiscal/verify

Retourne { valid: true, count: 1234 } si la chaîne est intègre, ou { valid: false, brokenAt: 567 } avec le numéro de la première écriture divergente sinon.

En cas de rupture : ne rien modifier en base. Faire un export FEC immédiat (preuve de l'état actuel), puis contacter le support pour investigation. Une rupture peut signaler une falsification, un trigger DB désactivé par erreur, ou une restauration partielle de backup.


3. Exporter le FEC (Fichier des Écritures Comptables)

Le FEC est l'export comptable réglementaire imposé par l'Article A47 A-1 du LPF en cas de contrôle fiscal (DGFiP). Le format est strict : fichier texte tabulé, 18 colonnes, encodage UTF-8 BOM, montants en virgule.

Comment exporter

  1. Aller dans Comptabilité.
  2. Sélectionner la période (du / au) — généralement une année fiscale complète : 1er janvier au 31 décembre.
  3. Cliquer sur la card FEC (Fichier des Écritures Comptables).
  4. Le téléchargement démarre. Nom du fichier : {SIREN}FEC{YYYYMMDD}.txt (ex. 812345678FEC20251231.txt).

Pré-requis : votre SIRET doit être renseigné dans Paramètres → Société. Sans SIRET, le préfixe SIREN du fichier sera XXXXXXXXX et le contrôleur DGFiP rejettera le fichier.

Que faire du fichier FEC

  • Le conserver 6 ans (CGI Article L102 B).
  • Le transmettre au contrôleur fiscal uniquement s'il en fait la demande explicite lors d'un contrôle (sinon : il vit dans vos archives).
  • Le sauvegarder dans un emplacement sûr (NAS, cloud chiffré).

4. Archiver une année complète (bundle ZIP signé)

Pour une conservation pérenne des données fiscales d'une année (CGI L102 B, durée 6 ans), FixVault propose un export ZIP signé qui contient :

  • Tous les Z-Reports PDF de l'année.
  • Le FEC officiel au format DGFiP.
  • L'export CSV des écritures fiscales (avec hash SHA-256 par ligne).
  • Un manifest.json récapitulatif (nombre d'entrées, dernier hash de chaîne, hash SHA-256 du bundle entier).

Comment archiver

  1. Aller dans Comptabilité.
  2. Carte Archivage annuel (conservation 6 ans).
  3. Sélectionner l'année à archiver (par défaut N-1, ex. 2025 si on est en 2026 — on archive l'année qui vient de se clôturer).
  4. Cliquer sur Archiver l'année.
  5. Le ZIP est téléchargé.

Ce que contient le ZIP

fixvault-archive-{slug}-{year}.zip
├── manifest.json (récapitulatif + sha256Bundle)
├── fiscal-entries.csv (écritures signées de l'année)
├── {SIREN}FEC{year}1231.txt (FEC DGFiP)
└── z-reports/
├── Z-0001.pdf
├── Z-0002.pdf
└── ...

Que faire du ZIP

  • Le stocker dans 2 emplacements distincts (règle 3-2-1 backup) :
    • 1 copie locale (NAS, disque externe).
    • 1 copie cloud chiffré (Drive, Dropbox, Hostinger Backup...).
  • Vérifier le hash SHA-256 : présent dans manifest.json (sha256Bundle) et dans le header HTTP de réponse (X-Archive-Bundle-SHA256). Permet de prouver à un contrôleur que le bundle n'a pas été altéré depuis sa génération.
  • Ne pas modifier le contenu du ZIP. Toute modification invalide le hash.

5. Procédure de restauration en cas de perte de données

FixVault sauvegarde automatiquement la base PostgreSQL chaque nuit (3h00), avec rotation locale 7 jours et archivage NAS sur 6 ans (CGI L102 B).

En cas de perte de données

  1. Ne rien faire en local — toute écriture après la perte rend le diagnostic plus complexe. Verrouiller l'accès à la caisse.
  2. Identifier la date de la perte (dernier état correct connu).
  3. Contacter le support technique avec :
    • Date / heure approximative de la perte.
    • Description de ce qui manque (factures, paiements, Z-Reports...).
    • Dernière sauvegarde fonctionnelle connue (vérifier dans /backups/ ou le NAS).
  4. Le support effectuera une restauration depuis le backup le plus proche, dans un environnement de test d'abord, puis valide la cohérence de la chaîne fiscale avant remise en production.

Vérifications post-restauration

  • Lancer GET /api/fiscal/verify → doit retourner valid: true.
  • Comparer le compteur d'écritures avec la sauvegarde précédente.
  • Re-générer un Z-Report du jour (vérifie que la chaîne accepte de nouvelles écritures).
  • Notifier l'expert-comptable si des données financières sont concernées.

Sauvegardes — emplacement et rétention

NiveauEmplacementRétentionFréquence
Local/backups/ du serveur7 joursQuotidien (3h00)
NASBACKUP_NAS_PATH distant~6 ans (2200 j)Quotidien (3h00)

Le script de backup est backend/scripts/backup-db.sh. Il loggue dans /var/log/fixvault-backup.log (vérifier régulièrement les erreurs).


6. Que présenter en cas de contrôle DGFiP

Voici la checklist des éléments à présenter au contrôleur fiscal lors d'une vérification de comptabilité ou d'un contrôle inopiné caisse (CGI 286-I-3bis) :

Éléments obligatoires

  • FEC de l'exercice contrôlé (Article A47 A-1 du LPF) — généré depuis Comptabilité → FEC.
  • Dossier d'auto-certification NF525 — fichier docs/NF525-AUTO-CERTIFICATION.md (à imprimer).
  • Z-Reports PDF de chaque journée d'exploitation contrôlée — depuis Comptabilité → Rapports Z.
  • Archives ZIP annuelles (conservation 6 ans) — depuis Comptabilité → Archivage annuel.
  • Vérification d'intégrité de la chaîne fiscale — capture d'écran du badge "Intègre" sur la page Comptabilité, ou réponse JSON de GET /api/fiscal/verify.

Éléments utiles (à fournir si demandés)

  • Liste des Z-Reports avec leur Grand Total perpétuel (continuité du cumul démontre l'absence de Z manquant).
  • Code source de la fonction computeFiscalHash (backend/src/lib/fiscal-hash.ts) — preuve technique de la chaîne SHA-256.
  • Migrations SQL des triggers ENABLE ALWAYS prévenant la modification des fiscal_entries — fichiers prisma/migrations/20260313213200_add_fiscal_entry_protection/ et 20260423110000_nf525_harden_triggers/.
  • Logs de backup (/var/log/fixvault-backup.log) — preuve de la conservation des données 6 ans.
  • Attestation des dépenses/rachats antérieurs au 23/04/2026 (passage en conformité NF525) — CSV généré par le script audit-pre-nf525-expenses.ts, archivé dans docs/nf525/.

Réponses préparées aux questions classiques

« Comment garantissez-vous que les écritures fiscales ne sont pas modifiables ? »

Trois couches : (1) trigger PostgreSQL no_update_fiscal_entries mode ENABLE ALWAYS qui rejette tout UPDATE/DELETE même en mode replica ; (2) chaîne SHA-256 entre écritures qui invalide tout hash modifié ; (3) chaque modification créerait une discontinuité visible dans la séquence. Cf. dossier d'auto-certification, section 3.

« Comment sont conservées les données 6 ans ? »

Backup quotidien automatisé (3h00) compressé gzip, copié sur NAS distant avec rotation 6 ans (~2200 jours). Cf. backend/scripts/backup-db.sh. Conservation locale 7 jours + NAS 6 ans = règle 3-2-1.

« Pourquoi la formule de hash a-t-elle changé le 27/04/2026 ? »

Renforcement anti-falsification de la ventilation TVA. Avant cette date, seul le TTC était hashé (formule v1). Depuis, HT + TVA + TTC sont tous les trois inclus (formule v2). Aucune entrée n'a été modifiée — la fonction verifyChain() accepte les deux formats simultanément. Cf. dossier d'auto-certification, section 3.1.


7. Synthèse — fréquence des actions

ActionFréquenceDurée
Z-Report quotidienTous les jours1 min (auto via fermeture caisse)
Vérification chaîne fiscaleHebdomadaire5 sec (regard sur la card)
Export FECÀ la demande (contrôle)30 sec
Archivage annuel ZIP1 fois/an (après clôture N-1)2 min
Vérification logs backupHebdomadaire2 min
Mise à jour SIRET / coordonnéesÀ chaque changement1 min

En cas de doute : ne rien modifier en base directement. Tout passer par l'interface FixVault qui respecte les contraintes NF525. Pour toute question : support@fixvault.fr ou ticket de support interne (Support → Nouveau ticket).