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 + tva

Les 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 » : dateEnvoi est renseignée et le montant TTC entre dans l'encours « en attente ». Les lignes restent modifiables (avenant avant acceptation).
  • Payé — action « Marquer payé » : datePaiement est 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.

Ouvrir le simulateur