PhynanxPhynanx

La trace

Chaque calcul rend, à côté de ses sorties, la suite ordonnée des étapes qui y mènent : c'est ce que l'interface affiche pour qu'un résultat se refasse à la main. La trace est servie par défaut ; ?trace=false l'omet.

Une étape

CléContenu
idIdentifiant de l'étape dans son module.
moduleIdModule qui l'a produite (fr_tva_standard_2025…), lié à son registre de mécanismes.
descriptionFrCe que fait l'étape, en français.
formulaLa formule appliquée, lisible.
inputsLes valeurs lues, par nom (montants en chaînes décimales).
outputLa valeur produite.
citationsLes textes qui fondent l'étape : authority (CGI, BOFiP, CSS, LoiFinances, BOSS, URSSAF…), reference, url (Légifrance quand elle existe), asOfDate (date de la version citée).

Exemple exécuté, avec la trace :

curl -s -X POST "http://localhost:3001/v1/calculators/calcul-tva-2025/calculate" \
  -H "Content-Type: application/json" \
  -d '{"montantHT":"100"}'

Réponse : statut 200.

{
  "slug": "calcul-tva-2025",
  "version": "1.0.0",
  "legalCorrections": [],
  "engineExtensions": [],
  "result": {
    "montantTVA": "20",
    "montantTTC": "120"
  },
  "cotisations": [],
  "steps": [
    {
      "id": "calcul_tva",
      "descriptionFr": "Application du taux normal de TVA (20 %)",
      "formula": "montantHT × 20 %",
      "inputs": {
        "montantHT": "100"
      },
      "output": "20",
      "citations": [
        {
          "authority": "CGI",
          "reference": "art. 278",
          "url": "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000026950057/",
          "asOfDate": "2014-01-01"
        }
      ],
      "moduleId": "fr_tva_standard_2025"
    },
    {
      "id": "calcul_ttc",
      "descriptionFr": "Calcul du montant TTC",
      "formula": "montantHT + montantTVA",
      "inputs": {
        "montantHT": "100",
        "montantTVA": "20"
      },
      "output": "120",
      "citations": [],
      "moduleId": "fr_tva_standard_2025"
    }
  ],
  "warnings": [],
  "rulesVersion": "[email protected]"
}

Cotisations

Pour un calculateur de paie, cotisations détaille chaque cotisation : group (salariale ou patronale), montant, base, taux, ses propres étapes et avertissements. Il est vide pour les autres calculateurs, et avec ?trace=false.

Avertissements

warnings liste en français les remarques non bloquantes du calcul : règle écartée faute de condition remplie, valeur non renseignée prise par défaut.

Écarts avec le simulateur officiel

Le moteur suit le texte applicable aux revenus de l'année (CGI, doctrine BOFiP opposable, formulaire officiel de la campagne). Les simulateurs officiels servent à le vérifier, sans faire foi. Deux listes de la réponse le disent pour la saisie transmise :

  • legalCorrections : les points où le simulateur de la DGFiP s'écarte du texte et où le moteur suit le texte. Chaque entrée nomme sa base légale (legalBasis), le comportement du simulateur (dgfipBehaviorFr) et celui du moteur (correctionFr).
  • engineExtensions : les cas réels que le simulateur ne traite pas et que le moteur calcule d'après le texte (simulatorBehaviorFr, engineBehaviorFr, legalBasis). Le montant n'y est pas vérifiable par le simulateur.

Pour un client, une liste vide veut dire que le résultat ne dépend d'aucun de ces écarts.

Explication

POST /v1/calculators/{slug}/explain reçoit la même saisie et rend l'explication déterministe du calcul : mécanismes déclenchés avec leur base légale, textes épinglés cités en français (verbatim), écarts avec le simulateur, et questions non bloquantes (questions). Tant qu'une question reste ouverte, présentez le résultat comme provisoire.