Journal d'Événements — NF525
Exigence NF525 : Toute action susceptible d'affecter les données de caisse doit être enregistrée de manière inaltérable.
1. Structure de la table audit_logs
| Colonne |
Type |
Description |
id |
INTEGER PK |
Identifiant auto-incrémenté |
event_type |
VARCHAR(50) |
Type d'événement (indexé) |
payload |
TEXT |
Détail JSON de l'événement |
user_id |
INTEGER |
ID utilisateur ayant déclenché l'action |
user_name |
VARCHAR(200) |
Nom de l'utilisateur (snapshot) |
signature |
TEXT |
Signature ECDSA de cette entrée |
previous_hash |
TEXT |
Signature de l'entrée précédente |
timestamp |
DATETIME |
Horodatage UTC (indexé) |
2. Types d'événements
2.1 Événements de caisse
| Type |
Payload type |
Description |
ORDER_CREATED |
{order_id, total_ttc, items_count, payment_method} |
Commande validée |
ORDER_PAID |
{order_id, amount, payment_method, paid_at} |
Encaissement commande |
ORDER_CANCELLED |
{order_id, reason, original_total} |
Annulation de commande |
ORDER_MODIFIED |
{order_id, changes: [{field, old, new}]} |
Modification post-validation |
2.2 Événements de paramétrage
| Type |
Payload type |
Description |
PRODUCT_CREATED |
{product_id, name, price} |
Nouveau produit |
PRODUCT_MODIFIED |
{product_id, changes: [{field, old, new}]} |
Modification de produit |
PRODUCT_DELETED |
{product_id, name} |
Suppression de produit |
SETTINGS_CHANGED |
{setting, old_value, new_value} |
Changement de configuration |
2.3 Événements d'accès
| Type |
Payload type |
Description |
USER_LOGIN |
{method: "pin"|"password", device} |
Connexion |
USER_LOGOUT |
{duration_minutes} |
Déconnexion |
USER_CREATED |
{user_id, name, role} |
Création de compte |
2.4 Événements de clôture
| Type |
Payload type |
Description |
DAILY_CLOSE |
{date, orders_count, total_ht, total_tva, total_ttc, breakdown_by_vat, breakdown_by_payment} |
Z de caisse |
MONTHLY_CLOSE |
{month, daily_closures_count, totals} |
Clôture mensuelle |
EXPORT_GENERATED |
{period, entries_count, format} |
Export fiscal |
3. Garanties
- Insertion uniquement — Aucune API de modification ou suppression du journal
- Chaîne signée — Chaque entrée est signée ECDSA et chaînée à la précédente
- Horodatage — Timestamp UTC server-side (non modifiable par le client)
- Snapshot utilisateur — Le nom de l'utilisateur est copié dans le log (indépendant de la table
users)
- Validation unifiée — Les payloads des événements sont validés par les mêmes schémas (
shared/schemas/) que ceux utilisés par l'API Backend et le Frontend, empêchant toute incohérence de type avant la signature.
4. API d'accès
GET /api/v1/audit/logs?event_type=ORDER_CREATED&limit=100&offset=0
GET /api/v1/audit/verify
GET /api/v1/audit/export?start_date=2026-01-01&end_date=2026-12-31
GET /api/v1/audit/stats
Code Source — Journal d'Audit