Documentation — Devis / Facturation
Modèle de données devis / ligne, règles de calcul (remises, TVA 20 %), cycle de statuts et numérotation des documents.
Modèle de données
Un devis porte l'en-tête commerciale (numéro, client, objet, dates) et son statut ; les montants ne sont jamais stockés : ils sont dérivés des lignes. Une ligne décrit une prestation avec sa quantité, son prix unitaire HT et une remise en pourcentage optionnelle.
{
"numero": "DV-2026-104",
"client": "ACME Industries",
"objet": "Refonte site vitrine",
"statut": "brouillon", // brouillon | envoye | paye
"dateCreation": "2026-06-09",
"dateEnvoi": null, // renseignée au passage en "envoye"
"datePaiement": null, // renseignée au passage en "paye"
"lignes": [
{
"designation": "Maquettes UI (5 gabarits desktop + mobile)",
"quantite": 5,
"prixUnitaire": 480.0, // HT, en euros
"remisePct": 0 // 0–100, optionnelle (0 = aucune)
}
]
}Calculs et TVA
La remise s'applique ligne par ligne, avant la TVA. Le taux unique de 20 % correspond aux prestations de services standard ; il suffit de paramétrer TVA_RATE pour un autre taux (ou un taux par ligne si votre activité mélange les régimes).
total_ligne_ht = quantite * prix_unitaire * (1 - remise_pct / 100)
total_ht = somme(total_ligne_ht)
tva = total_ht * 0.20 # TVA 20 %
total_ttc = total_ht + tvaLes totaux sont recalculés à chaque ajout, édition ou suppression de ligne (mémoïsation côté interface) — aucun risque d'écart entre les lignes et le pied de document.
Cycle de statuts
- Brouillon — état initial à la création. Lignes librement éditables ; l'envoi est bloqué tant que le devis est vide.
- Envoyé — action « Envoyer au client » :
dateEnvoiest renseignée et le montant TTC entre dans l'encours « en attente ». Les lignes restent modifiables (avenant avant acceptation). - Payé — action « Marquer payé » :
datePaiementest renseignée, le montant bascule dans « Encaissé » et le document devient en lecture seule (valeur probante : on ne modifie pas un document réglé, on en émet un nouveau).
Les transitions sont strictement séquentielles (brouillon → envoyé → payé) ; il n'y a pas de retour en arrière. Pour annuler un devis envoyé, on le laisse expirer (validité 30 jours) ou on émet un devis correctif.
Numérotation
Format DV-AAAA-NNN : préfixe document (DV pour devis, FA pour la facture émise à l'acceptation), année d'émission, puis compteur séquentiel sans trou ni réutilisation — exigence comptable. Dans le simulateur, le compteur reprend après le dernier numéro seedé (DV-2026-104 → le prochain devis créé reçoit DV-2026-105). En production, le numéro est attribué par la base (séquence) au moment de la création, jamais côté client.
Impression et intégration
L'aperçu met en forme l'en-tête société, le client, les lignes et les totaux, puis s'appuie sur window.print() (seule la zone du devis est imprimée). Pour aller plus loin : persister devis et lignes en base, déclencher l'envoi d'e-mail au passage en « envoyé », et générer le PDF côté serveur si vous devez archiver les documents émis.