Guide de Validation de la Facturation et Conformité
Ce document décrit comment valider le fonctionnement de la facturation et assurer la conformité du système.
Table des matières
- Vue d'ensemble
- Validations Fonctionnelles
- Validations de Conformité
- Tests Automatisés
- Checklist de Validation
Vue d'ensemble
Le système de facturation doit respecter:
- Validations fonctionnelles: règles métier, calculs corrects, intégrité des données
- Validations de conformité: sécurité, audit trail, propriété des ressources
- Validations légales: format des factures, règles fiscales (selon la juridiction)
Validations Fonctionnelles
1. Validation des Schémas (Zod)
Les factures sont validées via des schémas Zod définis dans backend/src/quotes-invoices/dto/create-invoice.dto.ts.
Règles de validation:
title: Requis, min 1 caractère, max 255 caractèresamount: Nombre >= 0 (par défaut 0)status: Enum (DRAFT,SENT,PAID,OVERDUE), par défautDRAFTsession_idoucontact_id: Au moins un des deux doit être fournidue_date: Date valide (optionnelle), doit être >=created_atitems: Array d'items (optionnel, par défaut[])
Items de facture:
item_type: Enum requis (PRODUCT,SERVICE,DISCOUNT)price_without_tax: Nombre >= 0price_with_tax: Nombre >= 0quantity: Nombre >= 0 (par défaut 1.0)vat_percentage: Nombre entre 0 et 100 (par défaut 0)discount_percentage: Nombre entre 0 et 100 (par défaut 0)discount_amount: Nombre >= 0 ou nulldiscount_type: Enum (PERCENTAGE_OF_TOTAL,FIXED_WITH_TAX,FIXED_WITHOUT_TAX) ou null
2. Calculs
Calcul des totaux (frontend et backend)
Les totaux sont calculés selon la logique suivante:
- Sous-total: Somme de
(price_without_tax * quantity * (1 - discount_percentage / 100))pour tous les items sauf les discounts - Taxes: Somme de
(item_subtotal * vat_percentage / 100)pour tous les items sauf les discounts - Réductions:
PERCENTAGE_OF_TOTAL:(subtotal + taxes) * discount_amount / 100FIXED_WITH_TAXouFIXED_WITHOUT_TAX:discount_amount
- Total:
subtotal + taxes - discountAmount
Montant automatique
Le montant total de la facture (invoice.amount) est automatiquement recalculé depuis les items lors de:
- Création de la facture avec items
- Mise à jour des items
- Suppression de tous les items (montant = 0)
3. Règles Métier
Propriété des ressources
- Un utilisateur ne peut créer/modifier/supprimer que ses propres factures
session_id,contact_id, etquote_iddoivent appartenir à l'utilisateur- Vérification via
verifyResourceOwnership()avant toute opération
États de facture
DRAFT: Brouillon, peut être modifié librementSENT: Envoyée au client, modifications limitéesPAID: Payée, statut final (ne peut pas être modifiée)OVERDUE: En retard de paiement (mise à jour automatique possible)
Dates
due_datedoit être >=created_atpaid_atest défini lors du paiement (via Stripe/PayPal)
Validations de Conformité
1. Sécurité
Vérification de propriété (Ownership)
Toutes les opérations CRUD vérifient que:
- L'utilisateur est propriétaire de la facture
- Les ressources liées (session, contact, quote) appartiennent à l'utilisateur
Audit Trail
Toutes les actions sont enregistrées dans audit_logs:
CREATE: Création de factureUPDATE: Modification de factureDELETE: Suppression de facture
Les logs incluent:
user_id: Utilisateur qui a effectué l'actionentity_type:INVOICEentity_id: ID de la factureresource_owner_id: Propriétaire de la factureaction: Type d'actionmetadata: Détails supplémentaires
2. Intégrité des Données
Contraintes de base de données
amount DECIMAL(10, 2) NOT NULL DEFAULT 0status CHECK (status IN ('DRAFT', 'SENT', 'PAID', 'OVERDUE'))- Clés étrangères vers
users,sessions,contacts,quotes - Index pour performances (
owner_id,session_id,status)
Cohérence
- Le montant de la facture doit correspondre à la somme des items
- Les items sont automatiquement recalculés à chaque modification
3. Conformité Légale
Format des factures
- Titre obligatoire
- Date de création automatique
- Date d'échéance optionnelle
- Montant en euros (format décimal)
Informations requises
- Identité du client (via
contact_idousession_id→ contact) - Description des prestations (via
items) - Montant total TTC
- TVA (via
vat_percentagedans les items)
Note: Les exigences légales peuvent varier selon la juridiction. Consultez un expert-comptable pour valider la conformité complète selon votre juridiction.
Tests Automatisés
Structure des tests
Les tests sont organisés dans backend/src/__tests__/quotes-invoices/:
quotes-invoices/
├── invoices-crud.service.spec.ts # Tests CRUD
├── invoices-validation.spec.ts # Tests de validation
├── invoices-calculations.spec.ts # Tests de calculs
├── invoices-compliance.spec.ts # Tests de conformité
└── invoices-items.service.spec.ts # Tests des items
Types de tests
1. Tests Unitaires (Validation)
Testent les schémas Zod et les règles de validation:
describe("createInvoiceSchema", () => {
it("should validate invoice with session_id", () => {});
it("should validate invoice with contact_id", () => {});
it("should reject invoice without session_id or contact_id", () => {});
it("should reject invoice with invalid due_date", () => {});
it("should validate invoice items", () => {});
});
2. Tests Unitaires (Calculs)
Testent les calculs de totaux:
describe("calculateDocumentTotals", () => {
it("should calculate subtotal correctly", () => {});
it("should calculate taxes correctly", () => {});
it("should apply percentage discounts", () => {});
it("should apply fixed discounts", () => {});
it("should handle empty items array", () => {});
});
3. Tests d'Intégration (CRUD)
Testent les opérations complètes avec la base de données:
describe("QuotesInvoicesInvoicesCrudService", () => {
it("should create invoice with items and calculate total", () => {});
it("should update invoice and recalculate total", () => {});
it("should prevent access to other user's invoices", () => {});
it("should verify session ownership", () => {});
it("should verify contact ownership", () => {});
});
4. Tests de Conformité
Testent la sécurité et l'audit:
describe("Invoice Compliance", () => {
it("should enforce ownership checks", () => {});
it("should create audit logs on CREATE", () => {});
it("should create audit logs on UPDATE", () => {});
it("should create audit logs on DELETE", () => {});
it("should maintain data integrity", () => {});
});
Exécution des tests
# Tous les tests de facturation
npm test -- quotes-invoices
# Tests spécifiques
npm test -- invoices-validation
npm test -- invoices-calculations
npm test -- invoices-compliance
# Avec couverture
npm test -- --coverage quotes-invoices
Checklist de Validation
Tests Automatisés
- Tests unitaires de validation (schémas Zod)
- Tests unitaires de calculs (totaux)
- Tests d'intégration CRUD
- Tests de conformité (sécurité, audit)
- Couverture de code >= 80%
Validations Fonctionnelles
- Création de facture avec session_id
- Création de facture avec contact_id
- Rejet si ni session_id ni contact_id
- Calcul automatique du montant depuis les items
- Mise à jour du montant lors de modification des items
- Validation de due_date >= created_at
- Validation des statuts (DRAFT, SENT, PAID, OVERDUE)
- Calcul correct des totaux (sous-total, taxes, réductions)
- Gestion des items avec réductions
- Gestion des items avec TVA
Validations de Conformité
- Vérification de propriété sur toutes les opérations
- Vérification de propriété des ressources liées (session, contact, quote)
- Audit logs pour CREATE
- Audit logs pour UPDATE
- Audit logs pour DELETE
- Intégrité des données (contraintes DB)
- Cohérence montant facture = somme items
Tests Manuels
- Création de facture via l'interface
- Modification de facture existante
- Suppression de facture
- Ajout/modification d'items
- Calcul automatique des totaux
- Export PDF de facture
- Envoi d'email de facture
- Paiement en ligne (Stripe/PayPal)
Documentation
- Guide de validation (ce document)
- Documentation des schémas de validation
- Documentation des calculs
- Guide de conformité légale (selon juridiction)
Ressources
- Schémas de validation:
backend/src/quotes-invoices/dto/ - Service CRUD:
backend/src/quotes-invoices/quotes-invoices-invoices-crud.service.ts - Service Items:
backend/src/quotes-invoices/quotes-invoices-items.service.ts - Calculs frontend:
frontend/src/utils/document-totals.utils.ts - Controllers:
backend/src/quotes-invoices/invoices.controller.ts - Tests:
backend/src/__tests__/quotes-invoices/
Support
Pour des questions sur la conformité légale, consultez un expert-comptable ou un avocat spécialisé dans le droit fiscal de votre juridiction.